home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / dsp / dspgroup / macros.arc / SOURCE.ASM < prev    next >
Encoding:
Assembly Source File  |  1983-11-17  |  156.2 KB  |  1,956 lines

  1.  
  2. *ARRAY MACROS                                                                   
  3. *AFFECTS:   XR0, AC, T, P                                                       
  4. *                                                                               
  5. *      ARRAY <NAME>,(<1ST DIM ARG>,<2ND DIM>,<2ND DIM ARG>, ... )               
  6. *                                                                               
  7. *ARGUMENTS MAY BE CONSTANTS OR VARIABLES                                        
  8. *DIMENSIONS MUST BE CONSTANTS (< 13 BITS)                                       
  9. *<NAME> MAY BE A CONSTANT ARRAY NAME: FOO                                       
  10. *       OR A VARIABLE CONTAINING A POINTER TO THE                               
  11. *       ARRAY: (FOO)                                                            
  12. *                                                                               
  13. *ARRAY LOCATION IS LEFT IN THE AC                                               
  14. *                                                                                
  15.        COPY MACROS.LCAC     
  16. *                                                    
  17. ARRAY  $MACRO            A,B,T                                                  
  18.        $IF  T.L=0        USE XR0 AS TEMP                                        
  19.        $ASG 'XR0' TO T.S                                                        
  20.        $ENDIF                                                                   
  21.        $ARY2 :T:,:B:     CALL ARY2 WITH TEMP                                    
  22.        $IF  A.L#=0                                                              
  23.        $IF  A.A&$POPL                                                           
  24.        ADD :A:           ADD ARRAY OFFSET VAR                                   
  25.        $ELSE                                                                    
  26.        SACL :T:,0        SAVE INDEX COMP                                        
  27.        LCAC :A:          LOAD ARRAY ADDR :A:                                    
  28.        ADD  :T:,0        ADD INDEX                                              
  29.        $ENDIF                                                                   
  30.        $ENDIF                                                                   
  31.        $END                                                                     
  32. ARY2  $MACRO            T,A,B,C,A2,B2,C2                                        
  33.        $IF  B.L=0                                                               
  34.        $IF  A.SA&$UNDF                                                          
  35.        LACK :A:          LOAD CONST 1ST DIM :A:                                 
  36.        $ELSE                                                                    
  37.        LAC  :A:,0        LOAD 1ST DIM :A:                                       
  38.        $ENDIF                                                                   
  39.        $ELSE                                                                    
  40.        $IF  C.SA&$UNDF                                                          
  41.        LACK :C:          LOAD CONST 2ND DIM :C:                                 
  42.        $ELSE                                                                    
  43.        LAC  :C:,0        LOAD 2ND DIM :C:                                       
  44.        $ENDIF                                                                   
  45.        $IF  A.SA&$UNDF                                                          
  46.        CALL LTK$         LOAD CONST 1ST DIM :A:                                 
  47.        REF  LTK$                                                                
  48.        DATA :A:                                                                 
  49.        $ELSE                                                                    
  50.        LT   :A:          LOAD 1ST DIM :A:                                       
  51.        $ENDIF                                                                   
  52.        $IF  B.SA&$UNDF                                                          
  53.        MPYK :B:          MPY BY DIM OF :C:                                      
  54.        $ELSE                                                                    
  55.        MPY  :B:          MPY BY DIM OF :C:                                      
  56.        $ENDIF                                                                   
  57.        APAC              ADD 1ST AND 2ND DIM                                    
  58.        $IF  A2.L#=0                                                             
  59.        SACL :T:,0        SAVE IN :T:                                            
  60.        $IF  B2.SA&$UNDF                                                         
  61.        LACK :B2:         LOAD CONST 3RD DIM :B2:                                
  62.        $ELSE                                                                    
  63.        LAC  :B2:,0       LOAD 3RD DIM :B2:                                      
  64.        $ENDIF                                                                   
  65.        LT   :T:          LOAD 1ST+2ND DIM                                       
  66.        $IF  A2.SA&$UNDF                                                         
  67.        MPYK :A2:         MPY BY DIM OF :B2:                                     
  68.        $ELSE                                                                    
  69.        MPY  :A2:         MPY BY DIM OF :B2:                                     
  70.        $ENDIF                                                                   
  71.        APAC              1ST+2ND+3RD DIM                                        
  72.        $IF  C2.L#=0      IF MORE DIM, RECUR                                     
  73.        $ARY3             :T:,:C2:                                               
  74.        $ENDIF                                                                   
  75.        $ENDIF                                                                   
  76.        $ENDIF                                                                   
  77.        $END                                                                     
  78. ARY3  $MACRO            T,A,B,C                                                 
  79.        SACL :T:,0        SAVE 1ST TO N-1TH DIM IN :T:                           
  80.        $IF  B.SA&$UNDF                                                          
  81.        LACK :B:          LOAD CONST NTH DIM :B:                                 
  82.        $ELSE                                                                    
  83.        LAC  :B:,0        LOAD CONST NTH DIM :B:                                 
  84.        $ENDIF                                                                   
  85.        LT   :T:          LOAD 1ST TO N-1TH DIM                                  
  86.        $IF  A.SA&$UNDF                                                          
  87.        MPYK :A:          MPY BY DIM OF :B:                                      
  88.        $ELSE                                                                    
  89.        MPY  :A:          MPY BY DIM OF :B:                                      
  90.        $ENDIF                                                                   
  91.        APAC              SUM 1ST TO NTH DIM                                     
  92.        $IF  C.L#=0       IF MORE DIM, RECUR                                     
  93.        $ARY3             :T:,:C:                                                
  94.        $ENDIF                                                                   
  95.        $END                                                                     
  96. *CASE                                                                           
  97. *AFFECTS: XR0, AR1, AC, STACK                                                   
  98. *                                                                               
  99. *CASE CONSTRUCT:                                                                
  100. *      CASE  V,(L0,L1,L2, ... ,LN)[,T|                                          
  101. *      [RETURNS HERE|                                                           
  102. *      .                                                                        
  103. *      .                                                                        
  104. *      .                                                                        
  105. *L0    [WHEN V=0|                                                               
  106. *      RET                                                                      
  107. *L1    [WHEN V=1|                                                               
  108. *      RET                                                                      
  109. *L2    [WHEN V=2|                                                               
  110. *      RET                                                                      
  111. *      .                                                                        
  112. *      .                                                                        
  113. *      .                                                                        
  114. *LN    [WHEN V=N|                                                               
  115. *      RET                                                                      
  116. *                                                                               
  117. *      V IS THE CONTROL VAR                                                     
  118. *      T IS A TEMPORARY (DEFAULTS TO XR0)                                       
  119. *      L1-LN ARE LABELS                                                         
  120. *                                                                               
  121. *      IF V CONTAINS M THEN LABEL LM IS CALLED                                  
  122. *      USING CALA (RETURN BY RET, AR1 IS KILLED)                                
  123. *                                                                                
  124. CASE   $MACRO            A,C,B     COMPUTED GOTO                                
  125.        $VAR L                                                                   
  126.        $ASG '$$LAB' TO L.S                                                      
  127.        $ASG L.SV+1 TO L.SV    TO NEXT UNIQUE LABEL                              
  128.        CALL L$:L.SV:          CALL AFTER LIST                                   
  129.        DATA :C:               LABEL LIST                                        
  130. L$:L.SV: POP                  POP LIST ADDR TO AC                               
  131.        ADD  :A:,0             ADD CONTRL VAR                                    
  132.        $IF  B.L=0                                                               
  133.        TBLR XR0               READ LABEL ADDR                                   
  134.        LAC  XR0,0             TO AC                                             
  135.        $ELSE                                                                    
  136.        TBLR :B:               READ LABEL TO :B:                                 
  137.        LAC  :B:,0             TO AC                                             
  138.        $ENDIF                                                                   
  139.        CALA                   CALL THE LABEL                                    
  140.        $END                                                                     
  141. *                                                                               
  142. *CHECK PROC NAMES                                                               
  143. *                                                                               
  144. CHECK $MACRO            A                                                       
  145.        $IF  A.L>4                                                               
  146.   **ERROR** NAME IS GREATR THAN 4 CHARS                                         
  147.        $ENDIF                                                                   
  148.        $END                                                                     
  149. COM3  $MACRO   A,B                                                              
  150.        $IF  A.L#=0                                                              
  151.        $VAR Q                                                                   
  152.        $ASG '''' TO Q.S                                                         
  153.        CSEG :Q::A::Q:    COMMON NAMED :A:                                       
  154.        $IF  B.L#=0                                                              
  155. :A:    BSS  :B:          :B: WORDS NAME :A:                                     
  156.        $ELSE                                                                    
  157. :A:    BSS  1            1 WORD NAMED :A:                                       
  158.        $ENDIF                                                                   
  159.        CEND              COMMON END                                             
  160.        $ENDIF                                                                   
  161.        $END                                                                     
  162. *DEFINE COMMON VARS                                                             
  163. *                                                                               
  164. *      COMMON   VAR-LIST                                                        
  165. *                                                                               
  166. *      VAR-LIST:=VAR-ITEM!VAR-ITEM,VAR-LIST                                     
  167. *      VAR-ITEM:=VAR!(VAR,SIZE)                                                 
  168. *      VAR IS VARIABLE SYMBOL                                                   
  169. *      SIZE IS NUMBER OF WORDS TO ALLOCATE                                      
  170.                                                                                 
  171. COMMON $MACRO  A1,A2,A3,A4,A5,A6,A7,A8                                          
  172.        $IF     A1.L#=0                                                          
  173.        $COM3   :A1:                                                             
  174.        $ENDIF                                                                   
  175.        $IF     A2.L#=0                                                          
  176.        $COM3   :A2:                                                             
  177.        $ENDIF                                                                   
  178.        $IF     A3.L#=0                                                          
  179.        $COM3   :A3:                                                             
  180.        $ENDIF                                                                   
  181.        $IF     A4.L#=0                                                          
  182.        $COM3   :A4:                                                             
  183.        $ENDIF                                                                   
  184.        $IF     A5.L#=0                                                          
  185.        $COM3   :A5:                                                             
  186.        $ENDIF                                                                   
  187.        $IF     A6.L#=0                                                          
  188.        $COM3   :A6:                                                             
  189.        $ENDIF                                                                   
  190.        $IF     A7.L#=0                                                          
  191.        $COM3   :A7:                                                             
  192.        $ENDIF                                                                   
  193.        $IF     A8.L#=0                                                          
  194.        COMMON  :A8:                                                             
  195.        $ENDIF                                                                   
  196.        $END                                                                     
  197. *CONDITIONAL REF - REF A IF A NOT DEFINED                                       
  198. *                                                                               
  199. CREF  $MACRO A                                                                  
  200.        $IF  A.SA&$UNDF                                                          
  201.        REF  :A:                                                                 
  202.        $ENDIF                                                                   
  203.        $END                                                                     
  204. *                                                                               
  205. *THIS MACRO, DDIF, CAN DO A DOT PRODUCT BETWEEN A VECTOR IN                     
  206. *  DATA RAM AND CONSTANTS IN PROGRAM ROM. FORM:                                 
  207. *  DIF <FIRST LT POSTFIX>,<LT POSTFIX>,<RAM VECTOR>,<COEFFICIENT LIST>          
  208. *  <LT POSTFIX> IS D OR A FOR LOAD T (WITH VECTOR ELEMENTS) USING               
  209. *       LTA - ELEMENTS WILL NOT BE MOVED AS A SIDE EFFECT                       
  210. *       LTD - ELEMENTS WILL BE MOVED, S0/SN MOVED TO S1/SN+1                    
  211. *  <FIRST LT POSTFIX> IS LIKE <LT POSTFIX>, BUT USED ON FIRST LT                
  212. *       ONLY. SOMETIMES MAKES SENSE TO MAKE IT BLANK (AS WELL AS A OR D)        
  213. *  <RAM VECTOR> IS THE ADDRESS OF THE LAST ELEMENT IN THE VECTOR                
  214. *       (USE AR1 AND *- TO ACCESS ELEMENTS)                                     
  215. *  <COEFFICIENT LIST> IS AN, ... , A0, WHERE EACH IS A 13 BIT CONSTANT          
  216. *       (FROM +4095 TO -4096) - THESE ARE IN REVERSE ORDER]]]                   
  217. *                                                                               
  218. *  THE FOLLOWING IS FORMED (IN THE AC):                                         
  219. *       P+AC+S0*A0+S1*A1+ ... +SN*AN->AC                                        
  220. *                   OR                                                          
  221. *        AC+S0*A0+S1*A1+ ... +SN*AN->AC                                         
  222. *                                                                               
  223. *  P AND AC MUST BE PRE-INITIALIZED                                             
  224. *                                                                                
  225. DDIF    $MACRO P0,P,S,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9                             
  226.         LARK AR1,:S:    LOAD AR1 WITH :S:                                       
  227.         LARP AR1        SELECT AR1                                              
  228.         $IF  A0.L#=0                                                            
  229.         $1DIF :A0:,:P0:                                                         
  230.         $ENDIF                                                                  
  231.         $IF  A1.L#=0                                                            
  232.         $1DIF :A1:,:P:                                                          
  233.         $ENDIF                                                                  
  234.         $IF  A2.L#=0                                                            
  235.         $1DIF :A2:,:P:                                                          
  236.         $ENDIF                                                                  
  237.         $IF  A3.L#=0                                                            
  238.         $1DIF :A3:,:P:                                                          
  239.         $ENDIF                                                                  
  240.         $IF  A4.L#=0                                                            
  241.         $1DIF :A4:,:P:                                                          
  242.         $ENDIF                                                                  
  243.         $IF  A5.L#=0                                                            
  244.         $1DIF :A5:,:P:                                                          
  245.         $ENDIF                                                                  
  246.         $IF  A6.L#=0                                                            
  247.         $1DIF :A6:,:P:                                                          
  248.         $ENDIF                                                                  
  249.         $IF  A7.L#=0                                                            
  250.         $1DIF :A7:,:P:                                                          
  251.         $ENDIF                                                                  
  252.         $IF  A8.L#=0                                                            
  253.         $1DIF :A8:,:P:                                                          
  254.         $ENDIF                                                                  
  255.         $IF  A9.L#=0                                                            
  256.         $2DIF :P:,:A9:                                                          
  257.         $ENDIF                                                                  
  258.         APAC            FLUSH TO THE AC                                         
  259.         $END                                                                    
  260. *DIF - DIGITAL FILTER GENERATOR                                                 
  261. *       THE AC, P, T, AND AR1 WILL BE USED (MAYBE XR0 TOO)                      
  262. *                                                                               
  263. *       DIF X,S,Y,G,RS,(A-LIST),(B-LIST)                                        
  264. *                                                                               
  265. *       X IS OPTIONAL INPUT VARIABLE (IF OMITTED AC ASSUMED)                    
  266. *       Y IS OPTIONAL OUTPUT VARIABLE (IF OMITTED AC IS ASSUMED)                
  267. *       S IS STATE VECTOR (SHOULD HAVE ONE WORD PER A/B-LIST ENTRY)             
  268. *       G IS THE GAIN (X*G IS INPUT) -13 BIT (+4095 TO -4096)                   
  269. *       RS IS THE VALUE USED TO SCALE S0 BEFORE OUTPUT (Y) CALCULATION          
  270. *               THE VALUE IS IN RIGHT SHIFTS (0 TO 16)                          
  271. *       PR IS PRECISION OF THE RESULT (0 TO 16, 15, AND 12 ARE THE              
  272. *                  SIGNIFICANT VALUES WHEN USED WITH RS=12 OR 15)               
  273. *       A-LIST IS A LIST OF 13 BIT CONSTANTS, AN, ... ,A1 (REVERSE):            
  274. *               S0 := (X*G+A1*S1+A2*S2+ ... +AN*SN)/2**RS                       
  275. *       B-LIST IS A LIST OF 13 BIT CONSTANTS, BN, ... ,B0 (REVERSE):            
  276. *               Y  := B0*S0+B1*S1+B2*S2+ ... +BN*SN                             
  277. *               EACH SM -> SM+1 AS ACCESSED ABOVE                               
  278. *                                                                               
  279. *       IF A-LIST IS BLANK, ONLY THE B-SIDE (POLES) ARE GENERATED               
  280. *               Y  := X*G+B1*S1+B2*S2+ ... +BN*SN   (B0 IS OMITTED)             
  281. *               S0 := X (OLD S0-SN-1 TO S1 TO SN)                               
  282. *       IF B-LIST IS BLANK, ONLY THE A-SIDE (ZEROS) ARE GENERATED               
  283. *               S0 := (X*G+A1*S1+A2*S2+ ... +AN*SN)/2**RS                       
  284. *                                                                               
  285. *       AR1 AND AR0 (IF A-LIST EMPTY ONLY) ARE DESTROYED.                       
  286. *                                                                                
  287.         COPY MACROS.RLSH                                                        
  288. *                                                                                
  289. DIF    $MACRO X,S,Y,G,RS,PR,A,B                                                 
  290.        $IF  G.L=0                                                               
  291.        $ASG 1 TO G.V                                                            
  292.        $ENDIF                                                                   
  293.        $IF  G.V=1                                                               
  294.        $IF  X.L#=0                                                              
  295.        LAC  :X:,0      LOAD INPUT TO AC                                         
  296.        $IF  A.L=0                                                               
  297.        LAR  AR0,:X:    LOAD INPUT INTO AR0                                      
  298.        $ENDIF                                                                   
  299.        $ELSE                                                                    
  300.        $IF  A.L=0                                                               
  301.        SACL XR0,0      STORE AC IN TEMP                                         
  302.        LAR  AR0,XR0    LOAD INPUT INTO AR0                                      
  303.        $ENDIF                                                                   
  304.        MPYK 0          INIT P                                                   
  305.        $ELSE                                                                    
  306.        $IF  X.L=0                                                               
  307.        SACL XR0,0      SAVE IN TEMP                                             
  308.        $ASG 'XR0' TO X.S                                                        
  309.        $ENDIF                                                                   
  310.        $IF  A.L=0                                                               
  311.        LAR  AR0,XR0    LOAD INPUT INTO AR0                                      
  312.        $ENDIF                                                                   
  313.        ZAC             INIT AC                                                  
  314.        LT   :X:        LOAD TEMP                                                
  315.        MPYK :G:        TIMES GAIN                                               
  316.        $ENDIF                                                                   
  317.        $IF  A.L#=0                                                              
  318.        DDIF D,D,:S:+:A.V:-1,:A:                                                 
  319.        $IF  RS.L=0     NO SHIFT                                                 
  320.        SACL :S:,0      SAVE :S:                                                 
  321.        $ELSE                                                                    
  322.        $IF  RS.V=16    SHIFT IS 16                                              
  323.        SACH :S:,0      SAVE :S:                                                 
  324.        $ELSE                                                                    
  325.        $IF  RS.V=0     NO SHIFT                                                 
  326.        SACL :S:,0      SAVE :S:                                                 
  327.        $ELSE                                                                    
  328.        $IF  (RS.V=15)&(PR.V<=15)    SHIFT 15                                    
  329.        SACH :S:,0      SAVE WITH 15 BIT SHIFT                                   
  330.        $ELSE                                                                    
  331.        $IF  (RS.V=12)&(PR.V<=12)    SHIFT 12                                    
  332.        SACH :S:,4      SAVE WITH 12 BIT SHIFT                                   
  333.        $ELSE                                                                    
  334.        SACX XR0,0      SAVE WHOLE DOUBLE WORD                                   
  335.        RLSH XR1,:S:,:RS:                                                        
  336.        LAC  XR0,16-:RS:                                                         
  337.        OR   :S:                                                                 
  338.        SACL :S:,0      SAVE :S:                                                 
  339.        $ENDIF                                                                   
  340.        $ENDIF                                                                   
  341.        $ENDIF                                                                   
  342.        $ENDIF                                                                   
  343.        $ENDIF                                                                   
  344.        $IF  B.L#=0                                                              
  345.        ZAC             INIT AC TO ZERO                                          
  346.        DDIF ,A,:S:+:B.V:-1,:B:                                                  
  347.        $ENDIF                                                                   
  348.        $ELSE                                                                    
  349.        DDIF A,D,:S:+:B.V:-1,:B:                                                 
  350.        SAR  AR0,:S:                                                             
  351.        $ENDIF                                                                   
  352.        $IF  Y.L#=0                                                              
  353.        SACL :Y:,0      STORE OUTPUT                                             
  354.        $ENDIF                                                                   
  355.        $END                                                                     
  356. DIF1   $MACRO V,P                                                               
  357.         LT:P: *-       LOAD THE STATE VAR                                       
  358.         MPYK :V:       TIMES THE COEFF                                          
  359.         $END                                                                    
  360. DIF2    $MACRO P,AA,B                                                           
  361.         $1DIF  :AA:,:P:                                                         
  362.         $IF  B.L#=0                                                             
  363.         $2DIF :P:,:B:                                                           
  364.         $ENDIF                                                                  
  365.         $END                                                                    
  366. *BEGIN LOOP BODY AFTER UNTIL OR WHILE                                           
  367. *                                                                                
  368. DO     $MACRO                                                                   
  369.        $VAR I,W                                                                 
  370.        $ASG '$$LPS' TO I.S      GET CNTXT VAR                                   
  371.        $ASG :I.SS: TO W.S       MAKE THIS CNTXT VAR                             
  372.        :W.SS: E$:W.SV:          GEN TEST & BRANCH                               
  373.        $END                                                                     
  374. DOT$   POP                                                                      
  375.        TBLR XR0                                                                 
  376.        LAR  AR0,XR0                                                             
  377.        ADD  ONE                                                                 
  378.        TBLR XR0                                                                 
  379.        LAR  AR1,XR0                                                             
  380.        ADD  ONE                                                                 
  381.        B    DOT$M                                                               
  382. *COMPUTE DOT PRODUCTS                                                           
  383. *A IS A DATA ARRAY                                                              
  384. *B IS A DATA ARRAY                                                              
  385. *L IS DIMENSION OF A AND B                                                      
  386. *AC IS SET TO:                                                                  
  387. *      A[0|*B[0|+A[1|*B[1|+ ... +A[L-1|*B[L-1|                                  
  388. *                                                                                
  389. DOTP   $MACRO            A,B,L                                                  
  390.        $VAR ST                                                                  
  391.        $ASG '*' TO ST.S                                                         
  392.        $IF  A.SV#=ST.SV                                                         
  393.        $IF  B.SV#=ST.SV                                                         
  394.        CALL DOT$         SUM OF                                                 
  395.        REF  DOT$                                                                
  396.        DATA :A:           :A:                                                   
  397.        DATA :B:           :B:                                                   
  398.        DATA :L:          DIM :L:                                                
  399.        $ELSE                                                                    
  400.        CALL DOT$1        SUM OF                                                 
  401.        REF  DOT$1                                                               
  402.        DATA :A:           :A:                                                   
  403.        DATA :L:          DIM :L:                                                
  404.        $ENDIF                                                                   
  405.        $ELSE                                                                    
  406.        $IF  B.SV#=ST.SV                                                         
  407.        CALL DOT$0        SUM OF                                                 
  408.        REF  DOT$0                                                               
  409.        DATA :B:           :B:                                                   
  410.        DATA :L:          DIM :L:                                                
  411.        $ELSE                                                                    
  412.        CALL DOT$01       SUM OF                                                 
  413.        REF  DOT$01                                                              
  414.        DATA :L:          DIM :L:                                                
  415.        $ENDIF                                                                   
  416.        $END                                                                     
  417. ELSE   $MACRO                                                                   
  418.        $VAR I,W                                                                 
  419.        $ASG '$$IFS' TO I.S      GET CNTEXT VAR                                  
  420.        $ASG :I.SS: TO W.S       MAKE THIS CNTEXT VAR                            
  421.        B    B$:W.SV:            BRANCH TO ENDIF                                 
  422. A$:W.SV: EQU $                  BEGIN ELSE CLAUSE                               
  423.        $END                                                                     
  424. ENDIF  $MACRO                                                                   
  425.        $VAR I,W,T,Q                                                             
  426.        $ASG '$$IFS' TO I.S      GET CNTEXT VAR                                  
  427.        $ASG 'A$' TO Q.S                                                         
  428.        $ASG :I.SS: TO W.S       MAKE THIS CNTEXT VAR                            
  429.        $ASG :Q::W.SV: TO T.S    CHECK FOR ELSE                                  
  430.        $IF  T.SA&$UNDF          IF NONE, DO IT                                  
  431. A$:W.SV: EQU $                  DUMMY ELSE CLAUSE                               
  432.        $ENDIF                                                                   
  433. B$:W.SV: EQU $                  END OF IF                                       
  434.        $ASG I.SV-1 TO I.SV      POP CNTEXT STACK                                
  435.        $ASG '$$IF' TO Q.S                                                       
  436.        $ASG :Q::I.SV: TO I.SS   BACK TO LAST CNTEXT VAR                         
  437.        $END                                                                     
  438. *FOR LOOP                                                                       
  439. *USES: AC                                                                       
  440. *                                                                               
  441. *      FOR  I,S,E,B                                                             
  442. *        .                                                                      
  443. *        .  [LOOP BODY|                                                         
  444. *        .                                                                      
  445. *      NEXT                                                                     
  446. *                                                                               
  447. *INIT VARIABLE I TO S, DO BODY IF I #= E                                        
  448. *      S AND E ARE CONSTANTS.                                                   
  449. *      TESTS AT THE TOP OF THE LOOP (IN THE FOR).                               
  450. *      INCREMENT BY B (A + OR - CONSTANT)                                       
  451. *      IF B IS OMITTED, -1 IS ASSUMED.                                          
  452. *      IF E IS OMITTED, 1(or -1) IS ASSUMED.                                    
  453. *                                                                                
  454.        COPY MACROS.LCAC                                                         
  455.        COPY MACROS.NEXT                                                         
  456. *                                                                                
  457. FOR    $MACRO            A,S,E,B   FOR LOOP HEADER                              
  458.        $IF   B.L=0       DEFLT INCR                                             
  459.        $ASG  '-1'  TO B.S                                                       
  460.        $ENDIF                                                                   
  461.        $VAR I,F,Q,W,WW                                                          
  462.        $ASG '$$LPS' TO I.S    GET LOOP CNTXT VAR                                
  463.        $ASG I.SV+1 TO I.SV    PUSH CNTXT                                        
  464.        $ASG '$$LP' TO Q.S                                                       
  465.        $ASG :Q::I.SV: TO I.SS MAKE THIS CNTXT VAR                               
  466.        $ASG '$$LAB' TO F.S    GET LABEL CNTER                                   
  467.        $ASG F.SV+1 TO F.SV    INCR                                              
  468.        $ASG :I.SS: TO W.S     SAVE THIS CNTXT NAME                              
  469.        $ASG F.SV TO W.SV      SAVE LABEL VALUE                                  
  470. V$:F.SV: EQU :B:              INCR VALUE                                        
  471.        $ASG 'V$' TO Q.S                                                         
  472.        $ASG :Q.S::F.SV: TO WW.S                                                 
  473.        LCAC  :S:              LOAD STRING INDEX                                 
  474.        B    F$:W.SV:          BEGIN TEST                                        
  475. I$:W.SV: EQU $                RE-LOOP ENTRY                                     
  476.        $IF  WW.SV=-1          IF INCR IS -1                                     
  477.        LAC  :A:,0             GET INDEX :A:                                     
  478.        SUB  ONE,0             DECR                                              
  479.        $ELSE                                                                    
  480.        $IF  WW.SV=1           IF INCR IS 1                                      
  481.        LAC  :A:,0             GET INDEX :A:                                     
  482.        ADD  ONE,0             INCR                                              
  483.        $ELSE                                                                    
  484.        LCAC :B:               GET INCR/DECR                                     
  485.        ADD  :A:,0             ADD TO INDEX :A:                                  
  486.        $ENDIF                                                                   
  487.        $ENDIF                                                                   
  488. F$:W.SV: EQU $                BEGIN TEST                                        
  489.        SACL :A:,0             SAVE AC TO INDEX :A:                              
  490.        $IF  E.L#=0            IF E IS PRESNT                                    
  491.        $IF  WW.SV<0                                                             
  492.        LCAC :E:-1             LOAD :E:+1                                        
  493.        $ELSE                                                                    
  494.        LCAC :E:+1                                                               
  495.        $ENDIF                                                                   
  496.        SUB  :A:,0             COMP TO INDEX :A:                                 
  497.        $ENDIF                                                                   
  498.        BZ   E$:W.SV:          END LOOP WHEN :A:#=:E:                            
  499.        $END                                                                     
  500. *FUNCTION DEFINITION MACRO                                                      
  501. *      GENERATES FORMAL ARGUMENT LOCATIONS ONLY                                 
  502. *                                                                               
  503. *      FUNC NAME,FORMAL-LIST                                                    
  504. *      FORMAL-LIST:=NIL!FORMAL!FORMAL,FORMAL-LIST                               
  505. *      FORMAL:=VAR!(VAR,SIZE)                                                   
  506. *                                                                               
  507. *      VAR IS VARIABLE NAME USED IN FUNCTION                                    
  508. *      SIZE IS THE NUMBER OF WORDS REQUIRED                                     
  509. *      NAME IF THE FUNCTION NAME (<4 CHARS)                                     
  510. *                                                                                
  511.        COPY  CHECK.SCR                                                          
  512.        COPY  CREF.SCR                                                           
  513.        COPY  PROC2.SCR                                                          
  514. *                                                                                
  515. FUNC   $MACRO            A,B1,B2,B3,B4,B5,B6,B7,B8                              
  516.        $CHECK :A:                                                               
  517.        PSEG              PROG SEG                                               
  518.        DEF  :A:                                                                 
  519. :A:    EQU  $            ENTRY POINT                                            
  520.        DSEG                                                                     
  521.        $VAR L                                                                   
  522.        $ASG '$$CNTR' TO L.S                                                     
  523.        $ASG 0 TO L.SV    INIT COUNT                                             
  524.        $ASG :A: TO L.SS                                                         
  525.        $IF    B1.L#=0                                                           
  526.        $PROC3 :B1:                                                              
  527.        $ENDIF                                                                   
  528.        $IF    B2.L#=0                                                           
  529.        $PROC3 :B2:                                                              
  530.        $ENDIF                                                                   
  531.        $IF    B3.L#=0                                                           
  532.        $PROC3 :B3:                                                              
  533.        $ENDIF                                                                   
  534.        $IF    B4.L#=0                                                           
  535.        $PROC3 :B4:                                                              
  536.        $ENDIF                                                                   
  537.        $IF    B5.L#=0                                                           
  538.        $PROC3 :B5:                                                              
  539.        $ENDIF                                                                   
  540.        $IF    B6.L#=0                                                           
  541.        $PROC3 :B6:                                                              
  542.        $ENDIF                                                                   
  543.        $IF    B7.L#=0                                                           
  544.        $PROC3 :B7:                                                              
  545.        $ENDIF                                                                   
  546.        $IF    B8.L#=0                                                           
  547.        $PROC2 :B8:                                                              
  548.        $ENDIF                                                                   
  549.        DEND              END OF DATA                                            
  550.        $VAR P                                                                   
  551.        $ASG '$$PROC' TO P.S                                                     
  552.        $ASG 0 TO P.SV    FLAG PROC TYPE                                         
  553.        $ASG :A: TO P.SS                                                         
  554.        $END                                                                     
  555. GLB3  $MACRO   A,B                                                              
  556.        DEF  :A:                                                                 
  557.        $IF  B.L#=0                                                              
  558. :A:    BSS  :B:          :B: WORDS NAME :A:                                     
  559.        $ELSE                                                                    
  560. :A:    BSS  1            1 WORD NAMED :A:                                       
  561.        $ENDIF                                                                   
  562.        $END                                                                     
  563. *DEFINE GLOBAL VARS                                                             
  564. *                                                                               
  565. *      GLOBAL VAR-LIST                                                          
  566. *                                                                               
  567. *      VAR-LIST:=VAR-ITEM!VAR-ITEM,VAR-LIST                                     
  568. *      VAR-ITEM:=VAR!(VAR,SIZE)                                                 
  569. *      VAR IS VARIABLE SYMBOL                                                   
  570. *      SIZE IS NUMBER OF WORDS TO ALLOCATE                                      
  571. *                                                                                
  572. GLOBAL $MACRO  A1,A2,A3,A4,A5,A6,A7,A8                                          
  573.        DSEG              DATA SEG                                               
  574.        $IF     A1.L#=0                                                          
  575.        $GLB3   :A1:                                                             
  576.        $ENDIF                                                                   
  577.        $IF     A2.L#=0                                                          
  578.        $GLB3   :A2:                                                             
  579.        $ENDIF                                                                   
  580.        $IF     A3.L#=0                                                          
  581.        $GLB3   :A3:                                                             
  582.        $ENDIF                                                                   
  583.        $IF     A4.L#=0                                                          
  584.        $GLB3   :A4:                                                             
  585.        $ENDIF                                                                   
  586.        $IF     A5.L#=0                                                          
  587.        $GLB3   :A5:                                                             
  588.        $ENDIF                                                                   
  589.        $IF     A6.L#=0                                                          
  590.        $GLB3   :A6:                                                             
  591.        $ENDIF                                                                   
  592.        $IF     A7.L#=0                                                          
  593.        $GLB3   :A7:                                                             
  594.        $ENDIF                                                                   
  595.        DEND              DATA END                                               
  596.        $IF     A8.L#=0                                                          
  597.        GLOBAL  :A8:                                                             
  598.        $ENDIF                                                                   
  599.        $END                                                                     
  600. *MACROS CALLED FROM GOSUB                                                       
  601. *                                                                               
  602. GOSB3 $MACRO            A,B                                                     
  603.        $VAR L,P                                                                 
  604.        $ASG '$$CNTR' TO L.S        GET COUNTR                                   
  605.        $ASG :L.SS::L.SV: TO P.S    MAKE FORMAL NAME                             
  606.        $IF  P.SA&$UNDF                                                          
  607.        REF  :P:                    DEFINE :P: AS EXTERN                         
  608.        $ENDIF                                                                   
  609.        $IF  A.SA&$UNDF             A IS A CONST                                 
  610.        $IF  B.L=0                  ONLY ONE CONST                               
  611.        $VAR M,Q                                                                 
  612.        $ASG '$$LAB' TO M.S                                                      
  613. V$:M.SV:    EQU :A:                COMPENSATE FOR NEG NUM                       
  614.        $ASG 'V$' TO Q.S                                                         
  615.        $ASG :Q.S::M.SV: TO A.S                                                  
  616.        $ASG M.SV+1 TO M.SV                                                      
  617.        $IF  (A.SV<256)&(A.SV>-1)                                                
  618.        LACK :A:                    ACC := 8 BIT CONST                           
  619.        $ELSE                                                                    
  620.        REF  LDAC$                  ACC := 16 BIT CONST                          
  621.        CALL LDAC$                                                               
  622.        DATA :A:                                                                 
  623.        $ENDIF                                                                   
  624.        SACL :P:                    SAVE IN :P:                                  
  625.        $ELSE                       MORE THAN ONE CONST                          
  626.        $IF  B.A&$POPL              MORE THAN TWO CONST                          
  627.        $ASG B.V+1 TO L.V                                                        
  628.        $ELSE                                                                    
  629.        $ASG 2 TO L.V               L.V = # OF CONST                             
  630.        $ENDIF                                                                   
  631.        REF  MOVC$                                                               
  632.        CALL MOVC$                  CALL CONST MOVER                             
  633.        DATA :P:                    TO :P:                                       
  634.        DATA :L.V:                  FOR :L.V: WORDS                              
  635.        DATA :A:,:B:                THE DATA                                     
  636.        $ENDIF                                                                   
  637.        $ELSE                       A IS A VARIABLE                              
  638.        $IF  B.V<2                  SINGLE SYMBOL                                
  639.        LAC  :A:,0                  LOAD :A:                                     
  640.        SACL :P:,0                  SAVE FOR SUBR IN :P:                         
  641.        $ELSE                                                                    
  642.        REF  MOVAB$                                                              
  643.        CALL MOVAB$                 CALL MOVER                                   
  644.        DATA :A:                    FROM :A:                                     
  645.        DATA :P:                    TO :P:                                       
  646.        DATA :B.V:                  FOR :B.V: WORDS                              
  647.        $ENDIF                                                                   
  648.        $ENDIF                                                                   
  649.        $ASG L.SV+1 TO L.SV         TO NEXT ARG                                  
  650.        $END                                                                     
  651. GOSB5 $MACRO            A,B                                                     
  652.        $VAR L,P                                                                 
  653.        $ASG '$$CNTR' TO L.S        TO COUNTR                                    
  654.        $IF  A.L#=0                 NON-BLANK                                    
  655.        $ASG :L.SS::L.SV: TO P.S    MAKE FORMAL NAME                             
  656.        $IF  P.SA&$UNDF                                                          
  657.        REF  :P:                    DEFINE :P: AS EXTERN                         
  658.        $ENDIF                                                                   
  659.        $IF  B.V<2                  SINGLE WORD                                  
  660.        LAC  :P:,0                  LOAD :P: FROM SUBR                           
  661.        SACL :A:,0                  SAVE IN :A:                                  
  662.        $ELSE                       MORE THAN ONE WORD                           
  663.        REF  MOVAB$                                                              
  664.        CALL MOVAB$                 CALL MOVER                                   
  665.        DATA :P:                    FROM :P:                                     
  666.        DATA :A:                    TO :A:                                       
  667.        DATA :B.V:                  FOR :B.V: WORDS                              
  668.        $ENDIF                                                                   
  669.        $ASG L.SV+1 TO L.SV         NEXT ARG                                     
  670.        $END                                                                     
  671. GOSB6 $MACRO  B1,B2,B3,B4,B5,B6,B7,B8                                           
  672.        $IF    B1.L#=0                                                           
  673.        $GOSB3 :B1:                                                              
  674.        $ENDIF                                                                   
  675.        $IF    B2.L#=0                                                           
  676.        $GOSB3 :B2:                                                              
  677.        $ENDIF                                                                   
  678.        $IF    B3.L#=0                                                           
  679.        $GOSB3 :B3:                                                              
  680.        $ENDIF                                                                   
  681.        $IF    B4.L#=0                                                           
  682.        $GOSB3 :B4:                                                              
  683.        $ENDIF                                                                   
  684.        $IF    B5.L#=0                                                           
  685.        $GOSB3 :B5:                                                              
  686.        $ENDIF                                                                   
  687.        $IF    B6.L#=0                                                           
  688.        $GOSB3 :B6:                                                              
  689.        $ENDIF                                                                   
  690.        $IF    B7.L#=0                                                           
  691.        $GOSB3 :B7:                                                              
  692.        $ENDIF                                                                   
  693.        $IF    B8.L#=0                                                           
  694.        $GOSB6 :B8:                                                              
  695.        $ENDIF                                                                   
  696.        $END   GOSB6                                                             
  697. GOSB7 $MACRO  B1,B2,B3,B4,B5,B6,B7,B8                                           
  698.        $IF    B1.L#=0                                                           
  699.        $GOSB5 :B1:                                                              
  700.        $ENDIF                                                                   
  701.        $IF    B2.L#=0                                                           
  702.        $GOSB5 :B2:                                                              
  703.        $ENDIF                                                                   
  704.        $IF    B3.L#=0                                                           
  705.        $GOSB5 :B3:                                                              
  706.        $ENDIF                                                                   
  707.        $IF    B4.L#=0                                                           
  708.        $GOSB5 :B4:                                                              
  709.        $ENDIF                                                                   
  710.        $IF    B5.L#=0                                                           
  711.        $GOSB5 :B5:                                                              
  712.        $ENDIF                                                                   
  713.        $IF    B6.L#=0                                                           
  714.        $GOSB5 :B6:                                                              
  715.        $ENDIF                                                                   
  716.        $IF    B7.L#=0                                                           
  717.        $GOSB5 :B7:                                                              
  718.        $ENDIF                                                                   
  719.        $IF    B8.L#=0                                                           
  720.        $GOSB7 :B8:                                                              
  721.        $ENDIF                                                                   
  722.        $END   GOSB7                                                             
  723. *GOSUB MACRO (CALL PROC OR FUNC)                                                
  724. *AFFECTS: STACK, AC, POSSIBLY AR1 AND/OR AR0                                    
  725. *                                                                               
  726. *      GOSUB ROUTINE,(TO-LIST),(FROM-LIST)                                      
  727. *                                                                               
  728. *      ROUTINE   := NAME OF FUNC OR PROC BEING CALLED                           
  729. *      T0-LIST   := TO-ARG!TO-ARG,TO-LIST                                       
  730. *      FROM-LIST := FROM-ARG!FROM-ARG,FROM-LIST                                 
  731. *                                                                               
  732. *      TO-ARG    := VARIABLE!(VARIABLE,LENGTH)!                                 
  733. *                   CONST!(CONST)!((CONST,CONST,...,CONST))                     
  734. *      FROM-ARG  := VARIABLE!(VARIABLE,LENGTH)                                  
  735. *                                                                               
  736. *      TO-LIST   := A GROUP OF VARIABLES COPIED TO ROUTINE                      
  737. *                   FORMAL LOCATIONS BEFORE CALL                                
  738. *      FROM-LIST := A GROUP OF VARIABLES COPIED FROM FORMAL                     
  739. *                   LOCATION AFTER THE RETURN                                   
  740. *      LENGTH    := NUMBER OF WORDS (IF OMITTED, DEFUALT IS ONE)                
  741. *      CONST     := CONSTANTS                                                   
  742. GOSUB  $MACRO A,B,C                                                             
  743.        $CHECK :A:                                                               
  744.        $VAR L                                                                   
  745.        $ASG '$$CNTR' TO L.S                                                     
  746.        $ASG 0 TO L.SV    INIT ARG COUNT                                         
  747.        $ASG :A: TO L.SS SAVE CALL NAME                                          
  748.        $IF  B.L#=0                                                              
  749.        $GOSB6 :B:                                                               
  750.        $ENDIF                                                                   
  751.        $IF  A.SA&$UNDF                                                          
  752.        REF  :A:          DEFINE AS EXTERN                                       
  753.        $ENDIF                                                                   
  754.        CALL :A:          CALL SUBR                                              
  755.        $ASG 0 TO L.SV    INIT ARG COUNT                                         
  756.        $IF  C.L#=0                                                              
  757.        $GOSB7 :C:                                                               
  758.        $ENDIF                                                                   
  759.        $END                                                                     
  760. *GOTO - another way to say B                                                    
  761. GOTO    $MACRO  A                                                               
  762.         B       :A:                                                             
  763.         $END                                                                    
  764. *IF-THEN-ELSE-ENDIF CONSTRUCTIONS                                               
  765. *USES: AC, AND RESOURCES NEED BY LET                                            
  766. *                                                                               
  767. *      IF   <COND>                                                              
  768. *      [COMPUTE EXPRESSION IN AC|                                               
  769. *      THEN                                                                     
  770. *      [IF AC TEST FAILS TO BRANCH DO THIS|                                     
  771. *   [  ELSE                                                                     
  772. *      [IF AC TEST BRANCHES DO THIS|   | <---OPTIONAL                           
  773. *      ENDIF                                                                    
  774. *OR:                                                                            
  775. *      IF   <COND>,<LET EXPRESSION>                                             
  776. *      THEN                                                                     
  777. *      [IF LET EXPRESSION TEST FAILS TO BRANCH DO THIS|                         
  778. *  [   ELSE                                                                     
  779. *      [IF LET EXPRESSION BRANCHES DO THIS|  <---OPTIONAL                       
  780. *      ENDIF                                                                    
  781. *                                                                               
  782. *IF'S MAY BE NESTED                                                             
  783. *<COND> IS:                                                                     
  784. *           EQ     AC(EXPR) IS =0                                               
  785. *           NE     AC(EXPR) IS NOT =0                                           
  786. *           LT     AC(EXPR) IS <0                                               
  787. *           GT     AC(EXPR) IS >0                                               
  788. *           GE     AC(EXPR) IS NOT <0                                           
  789. *           LE     AC(EXPR) IS NOT >0                                           
  790. *      OR:                                                                      
  791. *           ANY 320 BRANCH INSTRUCTION                                          
  792.                                                                                 
  793. IF     $MACRO      C,EE                                                         
  794.        $VAR I,E,Q,W,T                                                           
  795.        $ASG '$$IFS' TO I.S      GET IS STACK INDEX                              
  796.        $ASG I.SV+1 TO I.SV      PUSH                                            
  797.        $ASG '$$IF' TO Q.S                                                       
  798.        $ASG :Q::I.SV: TO I.SS   MAKE CNTEXT VAR NAME                            
  799.        $ASG '$$LAB' TO E.S      GET LABEL GEN                                   
  800.        $ASG E.SV+1 TO E.SV      NEXT LABEL                                      
  801.        $ASG :I.SS: TO W.S       MAKE THE CNTEXT NAME SYMBOL                     
  802.        $ASG E.SV TO W.SV        SAVE LABEL INDEX AS VALUE                       
  803.        $ASG 'EQ' TO T.S                                                         
  804.        $IF  C.SV=T.SV           EQUAL                                           
  805.        $ASG 'BNZ' TO W.SS                                                       
  806.        $ELSE                                                                    
  807.        $ASG 'NE' TO T.S                                                         
  808.        $IF  C.SV=T.SV           NOT EQUAL                                       
  809.        $ASG 'BZ' TO W.SS                                                        
  810.        $ELSE                                                                    
  811.        $ASG 'GT' TO T.S                                                         
  812.        $IF  C.SV=T.SV           GT                                              
  813.        $ASG 'BLEZ' TO W.SS                                                      
  814.        $ELSE                                                                    
  815.        $ASG 'LT' TO T.S                                                         
  816.        $IF  C.SV=T.SV           LT                                              
  817.        $ASG 'BGEZ' TO W.SS                                                      
  818.        $ELSE                                                                    
  819.        $ASG 'GE' TO T.S                                                         
  820.        $IF  C.SV=T.SV           GE                                              
  821.        $ASG 'BLZ' TO W.SS                                                       
  822.        $ELSE                                                                    
  823.        $ASG 'LE' TO T.S                                                         
  824.        $IF  C.SV=T.SV           LE                                              
  825.        $ASG 'BGZ' TO W.SS                                                       
  826.        $ELSE                                                                    
  827.        $ASG :C: TO W.SS         SAVE THE BRANCH                                 
  828.        $ENDIF                                                                   
  829.        $ENDIF                                                                   
  830.        $ENDIF                                                                   
  831.        $ENDIF                                                                   
  832.        $ENDIF                                                                   
  833.        $ENDIF                                                                   
  834.        $IF  EE.L#=0                                                             
  835.        LET  :EE:                PROCSS LET EXPR                                 
  836.        $ENDIF                                                                   
  837.        $END                                                                     
  838. *INIT MEMORY MACRO                                                              
  839. *USES: AR0, AR1, AC                                                             
  840. *                                                                               
  841. *      INIT <ITEM-LIST>                                                         
  842. *      <ITEM-LIST>:=<ITEM>!<ITEM>,<ITEM-LIST>                                   
  843. *      <ITEM>:=(<CONST>,VAR)                                                    
  844. *      VAR IS A SYMBOLIC MEMORY LOCATION TO INITIALIZED                         
  845. *      <CONST>:=VALUE!(VALUE,VALUE,VALUE, ... ,VALUE)                           
  846. *      VALUE IS AN ASSY TIME CONSTANT                                           
  847.                                                                                 
  848. INIT   $MACRO            A1,A2,A3,A4,A5,A6,A7,A8                                
  849.        CALL INIT$        CALL INIT SUBR                                         
  850.        REF  INIT$                                                               
  851.        $IF  A1.L#=0                                                             
  852.        $INIT3            :A1:   ITEM 1                                          
  853.        $ENDIF                                                                   
  854.        $IF  A2.L#=0                                                             
  855.        $INIT3            :A2:   ITEM 2                                          
  856.        $ENDIF                                                                   
  857.        $IF  A3.L#=0                                                             
  858.        $INIT3            :A3:   ITEM 3                                          
  859.        $ENDIF                                                                   
  860.        $IF  A4.L#=0                                                             
  861.        $INIT3            :A4:   ITEM 4                                          
  862.        $ENDIF                                                                   
  863.        $IF  A5.L#=0                                                             
  864.        $INIT3            :A5:   ITEM 5                                          
  865.        $ENDIF                                                                   
  866.        $IF  A6.L#=0                                                             
  867.        $INIT3            :A6:   ITEM 6                                          
  868.        $ENDIF                                                                   
  869.        $IF  A7.L#=0                                                             
  870.        $INIT3            :A7:   ITEM 7                                          
  871.        $ENDIF                                                                   
  872.        $IF  A8.L#=0                                                             
  873.        $INIT2            :A8:   ITEM 8                                          
  874.        $ENDIF                                                                   
  875.        DATA -1           END OF INIT LIST                                       
  876.        $END                                                                     
  877. INIT2 $MACRO            A,B                                                     
  878.        $INIT3            :A:  DO AN ITEM                                        
  879.        $IF  B.L#=0                                                              
  880.        $INIT2            :B:  RECURS                                            
  881.        $ENDIF                                                                   
  882.        $END                                                                     
  883. INIT3 $MACRO            A,B                                                     
  884.        $IF  A.L#=0                                                              
  885.        $IF  A.A&$POPL    VALUE LIST                                             
  886.        DATA :A.V:        FOR :A.V: WORDS                                        
  887.        $ELSE                                                                    
  888.        DATA 1            FOR ONE WORD                                           
  889.        $ENDIF                                                                   
  890.        DATA :B:          TO :B:                                                 
  891.        DATA :A:          DATA LIST                                              
  892.        $ENDIF                                                                   
  893.        $END                                                                     
  894. *TEST IF VALUE IS IN A RANGE                                                    
  895. *USES: AC                                                                       
  896. *                                                                               
  897. *      INRNG   VAR,LOW,HIGH,LABEL                                               
  898. *                                                                               
  899. *BRANCH TO LABEL IF THE CONTENTS OF VAR IS >=LOW                                
  900. *      <= HIGH                                                                  
  901. *LOW AND HIGH MAY BE CONSTANTS OR VARIABLES                                     
  902.                                                                                 
  903.        COPY  MACROS.LCAC                                                        
  904.                                                                                 
  905. INRNG  $MACRO            A,B,C,D   RANGE INSIDE TEST                            
  906.        $VAR L                                                                   
  907.        $ASG '$$LAB' TO L.S    UNIQUE LABEL VAR                                  
  908.        $ASG L.SV+1 TO L.SV                                                      
  909.        $IF  B.SA&$UNDF                                                          
  910.        LCAC -(:B.V:)     LOAD -(:B:)                                            
  911.        ADD  :A:,0        COMP TO :A:                                            
  912.        $ELSE                                                                    
  913.        LAC  :A:,0        LOAD :A:                                               
  914.        SUB  :B:,0        COMP TO :B:                                            
  915.        $ENDIF                                                                   
  916.        BLZ  L$:L.SV:     BRANCH IF :A:<:B:                                      
  917.        $IF  C.SA&$UNDF                                                          
  918.        LCAC -(:C.V:)     LOAD -(:C:)                                            
  919.        ADD  :A:,0        COMP TO :A:                                            
  920.        $ASG L.SV-1 TO L.SV                                                      
  921.        $ELSE                                                                    
  922.        LAC  :A:,0        LOAD :A:                                               
  923.        SUB  :C:,0        COMP TO :C:                                            
  924.        $ENDIF                                                                   
  925.        BLEZ :D:          BRANCH IF :A:>=:B: & :A:<=:C:                          
  926. L$:L.SV: EQU $                                                                  
  927.        $END                                                                     
  928. *INTERRUPT PROCEDURE DEFINITION MACRO                                           
  929. *      SETS UP VECTOR AT 0 AND 2, DISABLE                                       
  930. *      INTERRUPTS, SAVES AC, AR1, AR0, STATUS, PC                               
  931. *                                                                               
  932. *A IS INTR NAME (<4 CHAR), B IF MAIN NAME (<4 CHAR)                             
  933. *                                                                               
  934. INTR   $MACRO            A,B                                                    
  935.        CHECK :A:                                                                
  936.        PSEG              PROG SEG                                               
  937.        B    :B:          BRANCH TO MAIN                                         
  938.        DEF  :A:                                                                 
  939. :A:    EQU  $            INTRPT ENTRY                                           
  940.        DINT              DISBLE                                                 
  941.        SST  :A:$S        SAVE STATUS                                            
  942.        LDPK 1            TO 2ND PAGE                                            
  943.        SACX :A:$C        SAVE AC (DOUBLE)                                       
  944.        POP               POP RETURN                                             
  945.        SACL :A:$R,0      SAVE AS RETURN                                         
  946.        SAR  AR0,:A:$0    SAVE AR0                                               
  947.        SAR  AR1,:A:$1    SAVE AR1                                               
  948.        LDPK 0            BACK TO PAGE 1                                         
  949.        $VAR Q                                                                   
  950.        $ASG '''' TO Q.S                                                         
  951.        CSEG :Q::A:$C:Q:  INTRPT COMMON                                          
  952. :A:$S  BSS  1            STATUS SAVE                                            
  953. :A:$C  BSS  2            AC SAVE                                                
  954. :A:$R  BSS  1            RETURN SAVE                                            
  955. :A:$0  BSS  1            AR0 SAVE                                               
  956. :A:$1  BSS  1            AR1 SAVE                                               
  957.        CEND              END                                                    
  958.        $VAR P                                                                   
  959.        $ASG '$$PROC' TO P.S                                                     
  960.        $ASG 3 TO P.SV    FLAG INTRPT                                            
  961.        $ASG :A: TO P.SS                                                         
  962.        $ASG '$$IPRC' TO P.S                                                     
  963.        $ASG :A: TO P.SS                                                         
  964.        $END                                                                     
  965. *DEFINE IVAR VARS (AFTER INTR MACRO ONLY)                                       
  966. *                                                                               
  967. *      IVAR VAR-LIST                                                            
  968. *                                                                               
  969. *      VAR-LIST:=VAR-ITEM!VAR-ITEM,VAR-LIST                                     
  970. *      VAR-ITEM:=VAR!(VAR,SIZE)                                                 
  971. *      VAR IS VARIABLE SYMBOL                                                   
  972. *      SIZE IS NUMBER OF WORDS TO ALLOCATE                                      
  973.                                                                                 
  974. IVAR   $MACRO  A1,A2,A3,A4,A5,A6,A7,A8                                          
  975.        $VAR Q,P                                                                 
  976.        $ASG '$$IPRC' TO P.S                                                     
  977.        $ASG '''' TO Q.S                                                         
  978.        CSEG :Q::P.SS:$C:Q: PAGE 1 INTR SEG                                      
  979.        $IF     A1.L#=0                                                          
  980.        $IVR3   :A1:                                                             
  981.        $ENDIF                                                                   
  982.        $IF     A2.L#=0                                                          
  983.        $IVR3   :A2:                                                             
  984.        $ENDIF                                                                   
  985.        $IF     A3.L#=0                                                          
  986.        $IVR3   :A3:                                                             
  987.        $ENDIF                                                                   
  988.        $IF     A4.L#=0                                                          
  989.        $IVR3   :A4:                                                             
  990.        $ENDIF                                                                   
  991.        $IF     A5.L#=0                                                          
  992.        $IVR3   :A5:                                                             
  993.        $ENDIF                                                                   
  994.        $IF     A6.L#=0                                                          
  995.        $IVR3   :A6:                                                             
  996.        $ENDIF                                                                   
  997.        $IF     A7.L#=0                                                          
  998.        $IVR3   :A7:                                                             
  999.        $ENDIF                                                                   
  1000.        CEND              END OF DATA                                            
  1001.        $IF     A8.L#=0                                                          
  1002.        IVAR    :A8:                                                             
  1003.        $ENDIF                                                                   
  1004.        $END                                                                     
  1005. IVR3  $MACRO   A,B                                                              
  1006.        $IF  B.L#=0                                                              
  1007. :A:    BSS  :B:          :B: WORDS NAME :A:                                     
  1008.        $ELSE                                                                    
  1009. :A:    BSS  1            1 WORD NAMED :A:                                       
  1010.        $ENDIF                                                                   
  1011.        $END                                                                     
  1012. *LET MACRO -- INTEGER COMPUTATIONS                                              
  1013. *      LET  LET-EXPR                                                            
  1014. *      LET-EXPR:=A!A,OP,B                                                       
  1015. *      A:=(LET-EXPR)!CONSTANT!SYMBOLIC RAM LOC LABEL!EMPTY                      
  1016. *           IF AA IS EMPTY, MEANS VALUE IN THE AC                               
  1017. *           (CONTINUATION FROM PREVIOUS LET)                                    
  1018. *      B:=(LET-EXPR)!CONSTANT!SYMBOLIC RAM LOC LABEL                            
  1019. *      OP:=+!-!/!*!&!##!--!//!LT!GT!EQ!LE!GE!NE!^                               
  1020. *           ADD -> +     LESS THAN ------------> LT                             
  1021. *           SUB -> -     GREATER THAN ---------> GT                             
  1022. *           DIV -> /     EQUAL ----------------> EQ                             
  1023. *           MPY -> *     LESS THAN OR EQUAL ---> LE                             
  1024. *           AND -> &     GREATER THAN OR EQUAL-> GE                             
  1025. *           XOR -> ##    NOT EQUAL ------------> NE                             
  1026. *           OR  -> ++                                                           
  1027. *           MOD -> //    SHIFT -> ^                                             
  1028. *                                                                               
  1029. LET    $MACRO  A,OP,B                                                           
  1030.        $VAR T,S,SF,ST,DB,NS,SZ                                                  
  1031.        $ASG '$$STSZ' TO SZ.S                                                    
  1032.        $ASG '$$STAR' TO NS.S                                                    
  1033.        $ASG '^' TO SF.S                                                         
  1034.        $IF  A.L#=0                                                              
  1035.        $IF  A.A&$POPL                                                           
  1036.        LET  :A:                                                                 
  1037.        $ELSE                                                                    
  1038.        $IF A.SA&$UNDF                                                           
  1039.        $IF  OP.SV=SF.SV                                                         
  1040.        LCAC :A:,:B:                                                             
  1041.        $ELSE                                                                    
  1042.        LCAC :A:                                                                 
  1043.        $ENDIF                                                                   
  1044.        $ELSE                                                                    
  1045.        $IF  OP.SV=SF.SV                                                         
  1046.        LAC  :A:,:B:                                                             
  1047.        $ELSE                                                                    
  1048.        LAC  :A:,0                                                               
  1049.        $ENDIF                                                                   
  1050.        $ENDIF                                                                   
  1051.        $ENDIF                                                                   
  1052.        $ENDIF                                                                   
  1053.        $IF  (OP.L#=0)&(OP.SV#=SF.SV)                                            
  1054.        $ASG '$$STSL' TO ST.S                                                    
  1055.        $ASG 1 TO S.V                                                            
  1056.        $ASG 0 TO DB.V                                                           
  1057.        $ASG '+' TO T.S                                                          
  1058.        $IF  OP.SV=T.SV                                                          
  1059.        $ASG 1 TO DB.V                                                           
  1060.        $ENDIF                                                                   
  1061.        $ASG '-' TO T.S                                                          
  1062.        $IF  OP.SV=T.SV                                                          
  1063.        $ASG 1 TO DB.V                                                           
  1064.        $ENDIF                                                                   
  1065.        $ASG '/' TO T.S                                                          
  1066.        $IF  OP.SV=T.SV                                                          
  1067.        $ASG 1 TO DB.V                                                           
  1068.        $ENDIF                                                                   
  1069.        $ASG '//' TO T.S                                                         
  1070.        $IF  OP.SV=T.SV                                                          
  1071.        $ASG 1 TO DB.V                                                           
  1072.        $ENDIF                                                                   
  1073.        $IF  B.A&$POPL                                                           
  1074.        $IF  ST.SV=0                                                             
  1075.        $IF  NS.SV<0                                                             
  1076.        LARK AR1,LETST$   LOAD STACK POINTR                                      
  1077.        LARP AR1                                                                 
  1078.        $ENDIF                                                                   
  1079.        $ENDIF                                                                   
  1080.        $ASG ST.SV+1 TO ST.SV                                                    
  1081.        MAR  *+                                                                  
  1082.        $IF  DB.V                                                                
  1083.        SACH *+,0                                                                
  1084.        $ASG ST.SV+1 TO ST.SV                                                    
  1085.        $ENDIF                                                                   
  1086.        SACL *,0                                                                 
  1087.        $IF  SZ.SV<ST.SV                                                         
  1088.  ERROR ***LETSET stack size of :ST.SV: is req'd***                              
  1089.        $ENDIF                                                                   
  1090.        LET  :B:                                                                 
  1091.        $ASG ST.SV-1 TO ST.SV                                                    
  1092.        $IF  DB.V                                                                
  1093.        $ASG ST.SV-1 TO ST.SV                                                    
  1094. ***** THIS ENDIF CHANGED FROM $ELSE....                                         
  1095.        $ENDIF                                                                   
  1096.        $IF  B.SA&$UNDF                                                          
  1097.        $IF  ST.SV=0                                                             
  1098.        $IF  NS.SV<0                                                             
  1099.        LARK AR1,LETST$   LOAD STACK POINTR                                      
  1100.        LARP AR1                                                                 
  1101.        $ENDIF                                                                   
  1102.        $ENDIF                                                                   
  1103.        MAR  *+                                                                  
  1104.        $IF  DB.V                                                                
  1105.        SACH *+,0                                                                
  1106.        SACL *,0                                                                 
  1107.        $IF  SZ.SV<2                                                             
  1108.  ERROR ***LETSET stack size of 2 is req'd***                                    
  1109.        $ENDIF                                                                   
  1110.        $ELSE                                                                    
  1111.        SACL *,0                                                                 
  1112.        $IF  SZ.SV<1                                                             
  1113.  ERROR ***LETSET stack size of 1 is req'd***                                    
  1114.        $ENDIF                                                                   
  1115.        $ENDIF                                                                   
  1116.        LCAC :B:                                                                 
  1117.        $ELSE                                                                    
  1118.        $ASG 0 TO S.V         LITRAL SECOND OPERND                               
  1119.        $ASG '+' TO T.S                                                          
  1120.        $IF  OP.SV=T.SV                                                          
  1121.        ADD  :B:,0             +                                                 
  1122.        $ENDIF                                                                   
  1123.        $ASG '-' TO T.S                                                          
  1124.        $IF  OP.SV=T.SV                                                          
  1125.        SUB  :B:,0             -                                                 
  1126.        $ENDIF                                                                   
  1127.        $ASG '*' TO T.S                                                          
  1128.        $IF  OP.SV=T.SV                                                          
  1129.        SACL XR0,0             SAVE AC                                           
  1130.        LT   XR0               LOAD T                                            
  1131.        MPY  :B:               *                                                 
  1132.        PAC                    TO AC                                             
  1133.        $ENDIF                                                                   
  1134.        $ASG '/' TO T.S                                                          
  1135.        $IF  OP.SV=T.SV                                                          
  1136.        SACH DDV$0+0,0         SAVE AC HIGH                                      
  1137.        SACL DDV$0+1,0         SAVE AC LOW                                       
  1138.        LAC  :B:,0             LOAD :B:                                          
  1139.        SACL DDV$1,0           SAVE :B:                                          
  1140.        CALL DDV$              DIVIDE                                            
  1141.        $IF  NS.SV=0                                                             
  1142.        LARP AR0                                                                 
  1143.        $ENDIF                                                                   
  1144.        LAC  DDV$2,0           LOAD QUOT                                         
  1145.        REF  DDV$,DDV$0,DDV$1,DDV$2,DDV$3                                        
  1146.        $ENDIF                                                                   
  1147.        $ASG '//' TO T.S                                                         
  1148.        $IF  OP.SV=T.SV                                                          
  1149.        SACH DDV$0+0,0         SAVE AC HIGH                                      
  1150.        SACL DDV$0+1,0         SAVE AC LOW                                       
  1151.        LAC  :B:,0             LOAD :B:                                          
  1152.        SACL DDV$1,0           SAVE :B:                                          
  1153.        CALL DDV$              DIVIDE                                            
  1154.        $IF  NS.SV=0                                                             
  1155.        LARP AR0                                                                 
  1156.        $ENDIF                                                                   
  1157.        LAC  DDV$3,0           LOAD REM                                          
  1158.        REF  DDV$,DDV$0,DDV$1,DDV$2,DDV$3                                        
  1159.        $ENDIF                                                                   
  1160.        $ASG '&' TO T.S                                                          
  1161.        $IF  OP.SV=T.SV                                                          
  1162.        AND  :B:               AND                                               
  1163.        $ENDIF                                                                   
  1164.        $ASG '##' TO T.S                                                         
  1165.        $IF  OP.SV=T.SV                                                          
  1166.        XOR  :B:               XOR                                               
  1167.        $ENDIF                                                                   
  1168.        $ASG '++' TO T.S                                                         
  1169.        $IF  OP.SV=T.SV                                                          
  1170.        OR   :B:               OR                                                
  1171.        $ENDIF                                                                   
  1172.        $ENDIF                                                                   
  1173.        $ENDIF                                                                   
  1174.        $IF S.V               STACKD 1ST OPERND                                  
  1175.        $ASG '+' TO T.S                                                          
  1176.        $IF  OP.SV=T.SV                                                          
  1177.        ADDS *-                                                                  
  1178.        ADDH *-                +                                                 
  1179.        $ENDIF                                                                   
  1180.        $ASG '-' TO T.S                                                          
  1181.        $IF  OP.SV=T.SV                                                          
  1182.        SACL XR0,0             SAVE SECOND                                       
  1183.        SACH XR1,0                                                               
  1184.        ZALS *-                RELOAD FIRST                                      
  1185.        ADDH *-                                                                  
  1186.        SUBS XR0               1ST-2ND                                           
  1187.        SUBH XR1                                                                 
  1188.        $ENDIF                                                                   
  1189.        $ASG '/' TO T.S                                                          
  1190.        $IF  OP.SV=T.SV                                                          
  1191.        SACL DDV$1,0           SAVE 2ND                                          
  1192.        LAC  *-,0              LOAD                                              
  1193.        SACL DDV$0+1,0         SAVE LOW                                          
  1194.        LAC  *-,0              LOAD                                              
  1195.        SACL DDV$0+0,0         SAVE HIGH                                         
  1196.        CALL DDV$              DIVIDE                                            
  1197.        $IF  NS.SV=0                                                             
  1198.        LARP AR0                                                                 
  1199.        $ENDIF                                                                   
  1200.        LAC  DDV$2,0           LOAD QUOT                                         
  1201.        REF  DDV$,DDV$0,DDV$1,DDV$2,DDV$3                                        
  1202.        $ENDIF                                                                   
  1203.        $ASG '//' TO T.S                                                         
  1204.        $IF  OP.SV=T.SV                                                          
  1205.        SACL DDV$1,0           SAVE 2ND                                          
  1206.        LAC  *-,0              LOAD                                              
  1207.        SACL DDV$0+1,0         SAVE LOW                                          
  1208.        LAC  *-,0              LOAD                                              
  1209.        SACH DDV$0+0,0         SAVE HIGH                                         
  1210.        CALL DDV$              DIVIDE                                            
  1211.        $IF  NS.SV=0                                                             
  1212.        LARP AR0                                                                 
  1213.        $ENDIF                                                                   
  1214.        LAC  DDV$3,0           LOAD REM                                          
  1215.        REF  DDV$,DDV$0,DDV$1,DDV$2,DDV$3                                        
  1216.        $ENDIF                                                                   
  1217.        $ASG '*' TO T.S                                                          
  1218.        $IF  OP.SV=T.SV                                                          
  1219.        SACL XR0,0             GET 2ND                                           
  1220.        LT   XR0               TO T REG                                          
  1221.        MPY  *-                MPY BY STACK                                      
  1222.        PAC                    TO AC                                             
  1223.        $ENDIF                                                                   
  1224.        $ASG '&' TO T.S                                                          
  1225.        $IF  OP.SV=T.SV                                                          
  1226.        AND  *-                AND                                               
  1227.        $ENDIF                                                                   
  1228.        $ASG '##' TO T.S                                                         
  1229.        $IF  OP.SV=T.SV                                                          
  1230.        XOR  *-                XOR                                               
  1231.        $ENDIF                                                                   
  1232.        $ASG '++' TO T.S                                                         
  1233.        $IF  OP.SV=T.SV                                                          
  1234.        OR   *-                OR                                                
  1235.        $ENDIF                                                                   
  1236.        $ENDIF                                                                   
  1237.        $ENDIF                                                                   
  1238.        $END                                                                     
  1239. *LETSET SETS UP LET STACK AND INITS LET OPERATOR SYMBOLS                        
  1240. *      LETSET <SIZE (WORDS) OF STACK>,<STACK AR REGISTER>                       
  1241. *      IF SECOND OPERAND IS SPECIFIED, THE AR IS LOADED WITH                    
  1242. *      THE TOP OF THE STACK, AND THE ARP IS SET (SECOND OPERAND                 
  1243. *      IS OPTIONAL, IN WHICH CASE, THE STACK IS SET UP IN THE                   
  1244. *      LET MACRO IF NEEDED).                                                    
  1245. *                                                                               
  1246. LETSET $MACRO  Z,AR                                                             
  1247.        $VAR T,L                                                                 
  1248.        $ASG '$$STSZ' TO T.S                                                     
  1249.        $ASG 0 TO T.SV                                                           
  1250.        $IF  Z.V#=0                                                              
  1251.        CSEG 'LETST$'                                                            
  1252. LETST$ EQU  $                                                                   
  1253.        BSS  :Z:          STACK AREA                                             
  1254.        $ASG $-LETST$ TO T.SV                                                    
  1255.        CEND                                                                     
  1256.        $ENDIF                                                                   
  1257.        $ASG '^' TO T.S                                                          
  1258.        $ASG >F0EF TO T.SV                                                       
  1259.        $ASG '+' TO T.S                                                          
  1260.        $ASG >F0F3 TO T.SV                                                       
  1261.        $ASG '-' TO T.S                                                          
  1262.        $ASG >F0F4 TO T.SV                                                       
  1263.        $ASG '/' TO T.S                                                          
  1264.        $ASG >F0F5 TO T.SV                                                       
  1265.        $ASG '//' TO T.S                                                         
  1266.        $ASG >F0F6 TO T.SV                                                       
  1267.        $ASG '&' TO T.S                                                          
  1268.        $ASG >F0F7 TO T.SV                                                       
  1269.        $ASG '##' TO T.S                                                         
  1270.        $ASG >F0F8 TO T.SV                                                       
  1271.        $ASG '++' TO T.S                                                         
  1272.        $ASG >F0F9 TO T.SV                                                       
  1273.        $ASG 'LT' TO T.S                                                         
  1274.        $ASG >F0FA TO T.SV                                                       
  1275.        $ASG 'LE' TO T.S                                                         
  1276.        $ASG >F0FB TO T.SV                                                       
  1277.        $ASG 'GT' TO T.S                                                         
  1278.        $ASG >F0FC TO T.SV                                                       
  1279.        $ASG 'GE' TO T.S                                                         
  1280.        $ASG >F0FD TO T.SV                                                       
  1281.        $ASG 'EQ' TO T.S                                                         
  1282.        $ASG >F0FE TO T.SV                                                       
  1283.        $ASG 'NE' TO T.S                                                         
  1284.        $ASG >F0FF TO T.SV                                                       
  1285.        $ASG '$$STSL' TO T.S                                                     
  1286.        $ASG 0 TO T.SV                                                           
  1287.        $ASG '$$LSOP' TO T.S                                                     
  1288.        $ASG 0 TO T.SV                                                           
  1289.        $ASG '$$STAR' TO T.S                                                     
  1290.        $ASG -1 TO T.SV                                                          
  1291.        $IF  AR.L#=0                                                             
  1292.        LARK :AR:,LETST$       LOAD STACK POINTR                                 
  1293.        LARP :AR:              SET ARP                                           
  1294.        $ASG AR.SV TO T.SV                                                       
  1295.        $ENDIF                                                                   
  1296.        $END                                                                     
  1297. *MOVE L(CONST) WORDS FROM A(ROM ITEM) TO B(RAM VAR)                             
  1298. *ROM ITEM IS:                                                                   
  1299. *      SYMBOL (VAR IN ROM)                                                      
  1300. *      CONSTANT                                                                 
  1301. *      CONSTANT LIST-> (CONSTANT, CONSTANT, ... , CONSTANT)                     
  1302. *                                                                               
  1303. MVC   $MACRO A,B,L                                                              
  1304.        $VAR ST,SP,SM                                                            
  1305.        $ASG '*' TO ST.S                                                         
  1306.        $ASG '*+' TO SP.S                                                        
  1307.        $ASG '*-' TO SM.S                                                        
  1308.        $IF  L.V<2                                                               
  1309.        $IF  A.L#=0                                                              
  1310.        LCAC :A:                                                                 
  1311.        $ENDIF                                                                   
  1312.        $IF  A.SV=ST.SV                                                          
  1313.        ARTAC AR0                                                                
  1314.        $ENDIF                                                                   
  1315.        TBLR :B:          READ ONE WORD                                          
  1316.        $ENDIF                                                                   
  1317.        $IF  L.V=2                                                               
  1318.        $IF  B.SV=ST.SV                                                          
  1319.        $IF  A.SV=ST.SV                                                          
  1320.        ARTAC AR0                                                                
  1321.        $ELSE                                                                    
  1322.        $IF  A.L#=0                                                              
  1323.        LCAC :A:                                                                 
  1324.        $ENDIF                                                                   
  1325.        $ENDIF                                                                   
  1326.        TBLR *+           READ FIRST WORD                                        
  1327.        ADD  ONE,0        INCR PNTER                                             
  1328.        TBLR *-           READ NEXT WORD                                         
  1329.        $ELSE                                                                    
  1330.        $IF  B.SV=SP.SV                                                          
  1331.        $IF  A.SV=ST.SV                                                          
  1332.        ARTAC AR0                                                                
  1333.        $ELSE                                                                    
  1334.        $IF  A.L#=0                                                              
  1335.        LCAC :A:                                                                 
  1336.        $ENDIF                                                                   
  1337.        $ENDIF                                                                   
  1338.        TBLR *+           READ FIRST WORD                                        
  1339.        ADD  ONE,0        INCR PNTER                                             
  1340.        TBLR *+           READ NEXT WORD                                         
  1341.        $ELSE                                                                    
  1342.        $IF  B.SV=SM.SV                                                          
  1343.        $IF  A.SV=ST.SV                                                          
  1344.        ARTAC AR0                                                                
  1345.        ADD  ONE,0        INCR PNTER                                             
  1346.        $ELSE                                                                    
  1347.        $IF  A.L#=0                                                              
  1348.        LCAC :A:+1                                                               
  1349.        $ELSE                                                                    
  1350.        ADD  ONE,0        INCR PNTER                                             
  1351.        $ENDIF                                                                   
  1352.        $ENDIF                                                                   
  1353.        TBLR *-           READ LAST WORDS                                        
  1354.        SUB  ONE,0        DECR PNTER                                             
  1355.        TBLR *-           READ FIRST WORD                                        
  1356.        $ELSE                                                                    
  1357.        $IF  A.SV=ST.SV                                                          
  1358.        ARTAC AR0                                                                
  1359.        $ELSE                                                                    
  1360.        $IF  A.L#=0                                                              
  1361.        LCAC :A:                                                                 
  1362.        $ENDIF                                                                   
  1363.        $ENDIF                                                                   
  1364.        TBLR :B:          READ FIRST WORD                                        
  1365.        ADD  ONE,0        INCR PNTER                                             
  1366.        TBLR :B:+1        READ SECND WORD                                        
  1367.        $ENDIF                                                                   
  1368.        $ENDIF                                                                   
  1369.        $ENDIF                                                                   
  1370.        $ENDIF                                                                   
  1371.        $IF  L.V>2                                                               
  1372.        $IF  B.SV=ST.SV                                                          
  1373.        $IF  A.L#=0                                                              
  1374.        CALL MOVC$A       MOVE                                                   
  1375.        REF  MOVC$A                                                              
  1376.        DATA :A:            FROM :A:                                             
  1377.        $ELSE                                                                    
  1378.        CALL MOVC$$       MOVE                                                   
  1379.        REF  MOVC$$                                                              
  1380.        $ENDIF                                                                   
  1381.        $ELSE                                                                    
  1382.        $IF  A.L#=0                                                              
  1383.        CALL MOVA$B       MOVE                                                   
  1384.        REF  MOVA$B                                                              
  1385.        DATA :A:            FROM :A:                                             
  1386.        $ELSE                                                                    
  1387.        CALL MOVC$B       MOVE                                                   
  1388.        REF  MOVC$B                                                              
  1389.        $ENDIF                                                                   
  1390.        DATA :B:            TO :B:                                               
  1391.        $ENDIF                                                                   
  1392.        DATA :L:            FOR :L: WORDS                                        
  1393.        $ENDIF                                                                   
  1394.        $END                                                                     
  1395.        $END                                                                     
  1396. *END OF FOR, WHILE, OR UNTIL LOOP                                               
  1397. *                                                                                
  1398. NEXT   $MACRO                                                                   
  1399.        $VAR I,W,T,Q                                                             
  1400.        $ASG '$$LPS' TO I.S           GET CNTXT VAR                              
  1401.        $ASG '$$LP' TO Q.S                                                       
  1402.        $ASG :I.SS: TO W.S            MAKE THIS CNTXT VAR                        
  1403.        B    I$:W.SV:                 BR TO LOOP START                           
  1404. E$:W.SV: EQU $                       END OF LOOP                                
  1405.        $ASG I.SV-1 TO I.SV           POP CNTXT                                  
  1406.        $ASG :Q::I.SV: TO I.SS        MAKE OLD THIS CNTXT VAR                    
  1407.        $END            
  1408. *                                                         
  1409. * TEST FOR OUT OF RANGE
  1410. *
  1411. *      OUTRNG VAR,LOW,HIGH,LABEL                                                
  1412. *                                                                               
  1413. *BRANCH TO LABEL IF CONT OF VAR > HIGH OR < LOW                                 
  1414. *LOW AND HIGH ARE VARS OR CONSTANTS                                             
  1415.                                                                                 
  1416.        COPY MACROS.LCAC                                                         
  1417.                                                                                 
  1418. OUTRNG $MACRO            A,B,C,D   RANGE OUTSIDE TEST                           
  1419.        $IF  B.SA&$UNDF                                                          
  1420.        LCAC -(:B.V:)     LOAD CONST -:B:                                        
  1421.        ADD  :A:,0        COMP :A:                                               
  1422.        $ELSE                                                                    
  1423.        LAC  :A:,0        LOAD :A:                                               
  1424.        SUB  :B:,0        COMP TO :B:                                            
  1425.        $ENDIF                                                                   
  1426.        BLZ  :D:          BR IF :A:<:B:                                          
  1427.        $IF  C.SA&$UNDF                                                          
  1428.        LCAC -(:C.V:)     LOAD CONST -:C:                                        
  1429.        ADD  :A:,0        COMP TO :A:                                            
  1430.        $ELSE                                                                    
  1431.        LAC  :A:,0        LOAD :A:                                               
  1432.        SUB  :C:,0        COMP TO :C:                                            
  1433.        $ENDIF                                                                   
  1434.        BGZ  :D:          BR IF :A:>:C:                                          
  1435.        $END                                                                     
  1436. *EVAL POLYNOMIAL                                                                
  1437. *X IS VAR CONTAINING A VALUE                                                    
  1438. *T IS AN EMPTY ARRAY THAT GETS SET TO                                           
  1439. *      1 X X**2 X**3 ... X**N                                                   
  1440. *A IS THE COEFFICIENT ARRAY                                                     
  1441. *L IS THE POLY ORDER                                                            
  1442.                                                                                 
  1443.        COPY MACROS.POWERS                                                       
  1444.        COPY MACROS.DOTP                                                         
  1445.                                                                                 
  1446. POLY   $MACRO            X,T,A,L                                                
  1447.        POWERS            :X:,:T:,:L:                                            
  1448.        DOTP              :T:,:A:,:L:+1                                          
  1449.        $END                                                                     
  1450. POW2  $MACRO            X,T,L                                                   
  1451.        $VAR TT                                                                  
  1452.        MPY  :X:          MULT BY VAR                                            
  1453.        PAC               TO AC                                                  
  1454.        SACL :T:,0        STORE IN ARRAY                                         
  1455.        $IF  L.V>0        RECUR                                                  
  1456.        $ASG L.V-1 TO TT.V                                                       
  1457.        $POW2             :X:,:T:+1,:TT.V:                                       
  1458.        $ENDIF                                                                   
  1459.        $END                                                                     
  1460. *COMPUTE POWERS OF X                                                            
  1461. *X IS VARIABLE CONTAINING A NUMBER                                              
  1462. *T IS SET TO: 1 X X**2 X**3, ... , X**L                                         
  1463.                                                                                 
  1464. POWERS $MACRO            X,T,L                                                  
  1465.        $VAR TT                                                                  
  1466.        LACK 1            LOAD A ONE                                             
  1467.        SACL :T:,0        INTO FIRST LOC                                         
  1468.        $IF  L.V>0                                                               
  1469.        LAC  :X:,0        LOAD THE VAR                                           
  1470.        SACL :T:+1,0      INTO SECOND LOC                                        
  1471.        $ENDIF                                                                   
  1472.        $IF  L.V>1                                                               
  1473.        LT   :X:          LOAD THE VAR INTO T                                    
  1474.        MPY  :X:          SQUARE IT                                              
  1475.        PAC               TO THE AC                                              
  1476.        SACL :T:+2,0      TO THE THIRD LOC                                       
  1477.        $ENDIF                                                                   
  1478.        $IF  L.V>2        RECUR                                                  
  1479.        $ASG L.V-3 TO TT.V                                                       
  1480.        $POW2             :X:,:T:+3,:TT.V:                                       
  1481.        $ENDIF                                                                   
  1482.        $END                                                                     
  1483. *PROCEDURE DEFINITION MACRO                                                     
  1484. *      GENERATES FORMAL ARGUMENT LOCATIONS, SAVES AR1&0, AND POPS               
  1485. *      RETURN STACK                                                             
  1486. *                                                                               
  1487. *      PROC NAME,FORMAL-LIST                                                    
  1488. *      FORMAL-LIST:=NIL!FORMAL!FORMAL,FORMAL-LIST                               
  1489. *      FORMAL:=VAR!(VAR,SIZE)                                                   
  1490. *                                                                               
  1491. *      VAR IS VARIABLE NAME USED IN FUNCTION                                    
  1492. *      SIZE IS THE NUMBER OF WORDS REQUIRED                                     
  1493. *      NAME IF THE PROCEDURE NAME (<4 CHARS)                                    
  1494.                                                                                 
  1495.        COPY CHECK.SCR                                                           
  1496.        COPY CREF.SCR                                                            
  1497.        COPY PROC2.SCR                                                           
  1498.                                                                                 
  1499. PROC   $MACRO            A,B1,B2,B3,B4,B5,B6,B7,B8                              
  1500.        $CHECK :A:                                                               
  1501.        PSEG              PROG SEG                                               
  1502.        DEF  :A:          DEF ENTRY                                              
  1503. :A:    EQU  $            ENTRY                                                  
  1504.        POP               POP RETURN                                             
  1505.        SACL :A:$R,0      SAVE IN :A:$R                                          
  1506.        SAR  AR0,:A:$0    SAVE AR0                                               
  1507.        SAR  AR1,:A:$1    SAVE AR1                                               
  1508.        DSEG              DATA SEG                                               
  1509. :A:$R  BSS  1            RETURN SAVE                                            
  1510. :A:$0  BSS  1            AR0 SAVE                                               
  1511. :A:$1  BSS  1            AR1 SAVE                                               
  1512.        $VAR L                                                                   
  1513.        $ASG '$$CNTR' TO L.S                                                     
  1514.        $ASG 0 TO L.SV    INIT FORMAL COUNT                                      
  1515.        $ASG :A: TO L.SS                                                         
  1516.        $IF    B1.L#=0                                                           
  1517.        $PROC3 :B1:                                                              
  1518.        $ENDIF                                                                   
  1519.        $IF    B2.L#=0                                                           
  1520.        $PROC3 :B2:                                                              
  1521.        $ENDIF                                                                   
  1522.        $IF    B3.L#=0                                                           
  1523.        $PROC3 :B3:                                                              
  1524.        $ENDIF                                                                   
  1525.        $IF    B4.L#=0                                                           
  1526.        $PROC3 :B4:                                                              
  1527.        $ENDIF                                                                   
  1528.        $IF    B5.L#=0                                                           
  1529.        $PROC3 :B5:                                                              
  1530.        $ENDIF                                                                   
  1531.        $IF    B5.L#=0                                                           
  1532.        $PROC3 :B6:                                                              
  1533.        $ENDIF                                                                   
  1534.        $IF    B7.L#=0                                                           
  1535.        $PROC3 :B7:                                                              
  1536.        $ENDIF                                                                   
  1537.        $IF    B8.L#=0                                                           
  1538.        $PROC2 :B8:                                                              
  1539.        $ENDIF                                                                   
  1540.        DEND              END OF DATA                                            
  1541.        $VAR P                                                                   
  1542.        $ASG '$$PROC' TO P.S                                                     
  1543.        $ASG 1 TO P.SV    FLAG PROC TYPE                                         
  1544.        $ASG :A: TO P.SS                                                         
  1545.        $END                                                                     
  1546. *MACROS INTERNAL TO MAIN, PROC, FUNC, INTR                                      
  1547. *                                                                               
  1548. PROC2 $MACRO            A,B                                                     
  1549.        $PROC3            :A:                                                    
  1550.        $IF  B.L#=0       IF MORE RECURS                                         
  1551.        $PROC2            :B:                                                    
  1552.        $ENDIF                                                                   
  1553.        $END                                                                     
  1554. PROC3 $MACRO            A,B                                                     
  1555.        $IF  A.L#=0                                                              
  1556. :A:    EQU  $            INTL NAME DEF                                          
  1557.        $VAR L                                                                   
  1558.        $ASG '$$CNTR' TO L.S                                                     
  1559. :L.SS::L.SV: EQU $       EXTL NAME DEF                                          
  1560.        DEF  :L.SS::L.SV:                                                        
  1561.        $IF  B.L#=0                                                              
  1562.        BSS  :B:          :B: WORDS                                              
  1563.        $ELSE                                                                    
  1564.        BSS  1            1 WORD                                                 
  1565.        $ENDIF                                                                   
  1566.        $ENDIF                                                                   
  1567.        $ASG L.SV+1 TO L.SV NEXT ARG                                             
  1568.        $END                                                                     
  1569. RSOP  $MACRO            A,B                                                     
  1570.        $SOP :A:                                                                 
  1571.        $IF  B.L#=0                                                              
  1572.        $RSOP             :B:                                                    
  1573.        $ENDIF                                                                   
  1574.        $END                                                                     
  1575. *SELECT CASE TO RUN BY MATCHING VALUES                                          
  1576. *                                                                               
  1577. *      SELECT A,(V0,V1,V2,...,VN-1),(L0,L1,L2,...,LN)                           
  1578. *      [RETURNS HERE|                                                           
  1579. *         .                                                                     
  1580. *         .                                                                     
  1581. *         .                                                                     
  1582. *L0    [DO THIS WHEN A=V0|                                                      
  1583. *      RET                                                                      
  1584. *L1    [DO THIS WHEN A=V1|    V0-VN ARE CONSTANTS                               
  1585. *      RET                                                                      
  1586. *L2    [DO THIS WHEN A=V2|    A IS A USER VARIABLE                              
  1587. *      RET                                                                      
  1588. *         .                   L0-LN ARE LABELS                                  
  1589. *         .                                                                     
  1590. *         .                                                                     
  1591. *LN-1  [DO THIS WHEN A=VN-1|                                                    
  1592. *      RET                                                                      
  1593. *LN    [DO THIS WHEN A NOT ANY VN|                                              
  1594. *      RET                                                                      
  1595.                                                                                 
  1596. SELECT $MACRO    A,C,D,B                                                        
  1597.        $IF  B.L=0             GET TEMP                                          
  1598.        $ASG 'XR0' TO B.S                                                        
  1599.        $ENDIF                                                                   
  1600.        LAC  :A:,0             LOAD SELECT :A:                                   
  1601.        CALL SEL$              CALL MATCHR                                       
  1602.        REF  SEL$                                                                
  1603.        DATA :C.V:             NUMBER OF ITEMS                                   
  1604.        DATA :C:               ITEM LIST                                         
  1605.        SACL :B:,0             SAVE INDEX IN TEMP                                
  1606.        $VAR L                                                                   
  1607.        $ASG '$$LAB' TO L.S                                                      
  1608.        $ASG L.SV+1 TO L.SV    GET A LABEL                                       
  1609.        CALL L$:L.SV:          CALL OVER COMPTD GOTO LIST                        
  1610.        DATA :D:               LABEL LIST                                        
  1611. L$:L.SV: POP                  POP LABEL LIST ADDR                               
  1612.        ADD  :B:,0             ADD INDEX                                         
  1613.        TBLR :B:               READ LABEL                                        
  1614.        LAC  :B:,0             TO AC                                             
  1615.        CALA                   GOT TO IT                                         
  1616.        $END                                                                     
  1617. SOP   $MACRO            AA,B,C                                                  
  1618.        $VAR T,A,F                                                               
  1619.        $ASG '$$FSOP' TO F.S                                                     
  1620.        $ASG '##' TO T.S                                                         
  1621.        $IF  (AA.SV#=T.SV)&(F.SV=0)                                              
  1622.        $ASG '$$LSOP' TO A.S                                                     
  1623.        $IF  A.SV=0                                                              
  1624.        $IF  C.SA&$UNDF                                                          
  1625.        CALL LTK$         LOAD                                                   
  1626.        REF  LTK$                                                                
  1627.        DATA :C:             :C:                                                 
  1628.        $ELSE                                                                    
  1629.        LT   :C:          LOAD :C:                                               
  1630.        $ENDIF                                                                   
  1631.        $ELSE                                                                    
  1632.        $IF  C.L#=0                                                              
  1633.        $ASG '+' TO T.S                                                          
  1634.        $IF  T.SV=A.SV                                                           
  1635.        $IF  C.SA&$UNDF                                                          
  1636.        APAC              ADD P TO AC                                            
  1637.        CALL LTK$         LOAD                                                   
  1638.        REF  LTK$                                                                
  1639.        DATA :C:             :C:                                                 
  1640.        $ELSE                                                                    
  1641.        LTA  :C:          LOAD :C: AND ADD P TO AC                               
  1642.        $ENDIF                                                                   
  1643.        $ENDIF                                                                   
  1644.        $ASG '++' TO T.S                                                         
  1645.        $IF  T.SV=A.SV                                                           
  1646.        $IF  C.SA&$UNDF                                                          
  1647.        APAC              ADD P TO AC                                            
  1648.        CALL LTK$         LOAD                                                   
  1649.        REF  LTK$                                                                
  1650.        DATA :C:             :C:                                                 
  1651.        $ELSE                                                                    
  1652.        LTD  :C:          LOAD :C:, ADD P TO AC, :C:->:C:+1                      
  1653.        $ENDIF                                                                   
  1654.        $ENDIF                                                                   
  1655.        $ASG '-' TO T.S                                                          
  1656.        $IF  T.SV=A.SV                                                           
  1657.        $IF  C.SA&$UNDF                                                          
  1658.        SPAC              SUB P FROM AC                                          
  1659.        CALL LTK$         LOAD                                                   
  1660.        REF  LTK$                                                                
  1661.        DATA :C:            :C:                                                  
  1662.        $ELSE                                                                    
  1663.        SPAC              SUB P FROM AC                                          
  1664.        LT   :C:          LOAD :C:                                               
  1665.        $ENDIF                                                                   
  1666.        $ENDIF                                                                   
  1667.        $ELSE                                                                    
  1668.        $ASG '+' TO T.S                                                          
  1669.        $IF T.SV=A.SV                                                            
  1670.        APAC              ADD P TO AC                                            
  1671.        $ENDIF                                                                   
  1672.        $ASG '++' TO T.S                                                         
  1673.        $IF  T.SV=A.SV                                                           
  1674.        APAC              ADD P TO AC                                            
  1675.        $ENDIF                                                                   
  1676.        $ASG '-' TO T.S                                                          
  1677.        $IF  T.SV=A.SV                                                           
  1678.        SPAC              SUB P FROM AC                                          
  1679.        $ENDIF                                                                   
  1680.        $ENDIF                                                                   
  1681.        $ENDIF                                                                   
  1682.        $IF  B.L#=0                                                              
  1683.        $IF  B.SA&$UNDF                                                          
  1684.        MPYK :B:          MLTPLY CONST :B:                                       
  1685.        $ELSE                                                                    
  1686.        MPY  :B:          MLTPLY :B:                                             
  1687.        $ENDIF                                                                   
  1688.        $ENDIF                                                                   
  1689.        $ASG AA.SV TO A.SV                                                       
  1690.        $ELSE                                                                    
  1691.        $ASG 1 TO F.SV                                                           
  1692.        $ENDIF                                                                   
  1693.        $END                                                                     
  1694. *STOP MACRO                                                                     
  1695. *      RETURNS FROM INTR, PROC OR FUNC                                          
  1696. *                                                                               
  1697. STOP   $MACRO                                                                   
  1698.        $VAR P                                                                   
  1699.        $ASG '$$PROC' TO P.S                                                     
  1700.        $IF  P.SV=0                                                              
  1701.        RET               RETURN FROM A FUNC                                     
  1702.        $ENDIF                                                                   
  1703.        $IF  P.SV=1                                                              
  1704.        LAR  AR0,:P.SS:$0 REST AR0                                               
  1705.        LAR  AR1,:P.SS:$1 REST AR1                                               
  1706.        LAC  :P.SS:$R,0   REST RETURN                                            
  1707.        PUSH              TO STACK                                               
  1708.        RET               RETURN FROM PROC                                       
  1709.        $ENDIF                                                                   
  1710.        $IF  P.SV=2                                                              
  1711.        B    :P.SS:       SIM A RESET (FROM MAIN)                                
  1712.        $ENDIF                                                                   
  1713.        $IF P.SV=3                                                               
  1714.        LDPK 1            GET TO INTR PAGE                                       
  1715.        LAR  AR0,:P.SS:$0 REST AR0                                               
  1716.        LAR  AR1,:P.SS:$1 REST AR1                                               
  1717.        LAC  :P.SS:$R,0   LOAD RETURN                                            
  1718.        PUSH              PUSH TO STACK                                          
  1719.        LDAX :P.SS:$C     RELOAD AC                                              
  1720.        LST  :P.SS:$S     REST STATUS                                            
  1721.        EINT              ENABLE INTRPS                                          
  1722.        RET               RETURN FROM INTRPT                                     
  1723.        $ENDIF                                                                   
  1724.        $END                                                                     
  1725. *SUMOFP - SUMS OF PRODUCTS                                                      
  1726. *                                                                               
  1727. *      SUMOFP    PRODUCTS-LIST                                                  
  1728. *                                                                               
  1729. *      PRODUCTS-LIST:=P-LIST,END-ITEM                                           
  1730. *      P-LIST:=PRODUCT-ITEM,P-LIST!PRODUCT-ITEM                                 
  1731. *      PRODUCT-ITEM:=(OPR,P1,P2,INCR)!##                                        
  1732. *      P1:=MULTIPLIER                                                           
  1733. *      P2:=MULTIPLICAND (TO THE T REGISTER)                                     
  1734. *          (IF P2 IS BLANK, USE THE LAST P2)                                    
  1735. *      OPR:=+!-!++                                                              
  1736. *           + IS LOAD T AND ACCUMULATE                                          
  1737. *           ++ IS LOAD T AND ACCUMULATE (WITH MOVE)                             
  1738. *           - IS LOAD T AND SUBTRACT FROM AC                                    
  1739. *      ##:=CONTINUATION ITEM (NEXT STMT WILL CONTINUE)                          
  1740.                                                                                 
  1741. SUMOFP $MACRO            A1,A2,A3,A4,A5,A6,A7,A8                                
  1742.        $VAR T,F                                                                 
  1743.        $ASG '$$FSOP' TO F.S                                                     
  1744.        $ASG 0 TO F.SV                                                           
  1745.        $ASG '$$LSOP' TO T.S                                                     
  1746.        $IF  T.SV=0                                                              
  1747.        ZAC                                                                      
  1748.        $ENDIF                                                                   
  1749.        $IF  A1.L#=0                                                             
  1750.        $SOP :A1:                                                                
  1751.        $ENDIF                                                                   
  1752.        $IF  A2.L#=0                                                             
  1753.        $SOP :A2:                                                                
  1754.        $ENDIF                                                                   
  1755.        $IF  A3.L#=0                                                             
  1756.        $SOP :A3:                                                                
  1757.        $ENDIF                                                                   
  1758.        $IF  A4.L#=0                                                             
  1759.        $SOP :A4:                                                                
  1760.        $ENDIF                                                                   
  1761.        $IF  A5.L#=0                                                             
  1762.        $SOP :A5:                                                                
  1763.        $ENDIF                                                                   
  1764.        $IF  A6.L#=0                                                             
  1765.        $SOP :A6:                                                                
  1766.        $ENDIF                                                                   
  1767.        $IF  A7.L#=0                                                             
  1768.        $SOP :A7:                                                                
  1769.        $ENDIF                                                                   
  1770.        $IF  A8.L#=0                                                             
  1771.        $RSOP :A8:                                                               
  1772.        $ENDIF                                                                   
  1773.        $IF  F.SV=0                                                              
  1774.        $SOP +                                                                   
  1775.        $ASG 0 TO T.SV                                                           
  1776.        $ENDIF                                                                   
  1777.        $END                                                                     
  1778. *
  1779. THEN   $MACRO                                                                   
  1780.        $VAR I,W                                                                 
  1781.        $ASG '$$IFS' TO I.S      GET CNTEXT VAR                                  
  1782.        $ASG :I.SS: TO W.S       MAKE THIS CNTEXT VAR                            
  1783.        :W.SS: A$:W.SV:          BRANCH TO ELSE CLAUSE                           
  1784.        $END                                                                     
  1785. *UNTIL LOOP MACRO                                                               
  1786. *USES: AC AND LET MACRO                                                         
  1787. *                                                                               
  1788. *      UNTIL COND                                                               
  1789. *           [CONDITION COMP IN AC|                                              
  1790. *      DO                                                                       
  1791. *           [LOOP BODY-DONE IF AC TEST AT DO IS FALSE|                          
  1792. *      NEXT                                                                     
  1793. *OR:                                                                            
  1794. *      UNTIL COND,<LET EXPR>                                                    
  1795. *      DO                                                                       
  1796. *           [LOOP BODY-DONE IF <LET EXPR> TEST IS FALSE|                        
  1797. *      NEXT                                                                     
  1798. *                                                                               
  1799. *CONDITIONS (COND) ARE THE SAME AS IN IF                                        
  1800.                                                                                 
  1801.        COPY MACROS.NEXT                                                         
  1802.        COPY MACROS.DO                                                           
  1803.                                                                                 
  1804. UNTIL  $MACRO          C,EE   START UNTIL CONDITIONAL                           
  1805.        $VAR I,E,Q,W,T                                                           
  1806.        $ASG '$$LPS' TO I.S    GET CNTXT VAR                                     
  1807.        $ASG I.SV+1 TO I.SV    PUSH CNTXT                                        
  1808.        $ASG '$$LP' TO Q.S                                                       
  1809.        $ASG :Q::I.SV: TO I.SS MAKE THIS CNTXT NAME                              
  1810.        $ASG '$$LAB' TO E.S    GET UIQUE LABEL                                   
  1811.        $ASG E.SV+1 TO E.SV    INCR                                              
  1812.        $ASG :I.SS: TO W.S     MAKE THIS CNTXT                                   
  1813.        $ASG E.SV TO W.SV      SAVE LABEL IN THIS CNTXT                          
  1814.        $ASG 'EQ' TO T.S                                                         
  1815.        $IF  C.SV=T.SV                                                           
  1816.        $ASG 'BZ' TO W.SS                                                        
  1817.        $ELSE                                                                    
  1818.        $ASG 'NE' TO T.S                                                         
  1819.        $IF  C.SV=T.SV                                                           
  1820.        $ASG 'BNZ' TO W.SS                                                       
  1821.        $ELSE                                                                    
  1822.        $ASG 'LT' TO T.S                                                         
  1823.        $IF  C.SV=T.SV                                                           
  1824.        $ASG 'BLZ' TO W.SS                                                       
  1825.        $ELSE                                                                    
  1826.        $ASG 'GT' TO T.S                                                         
  1827.        $IF  C.SV=T.SV                                                           
  1828.        $ASG 'BGZ' TO W.SS                                                       
  1829.        $ELSE                                                                    
  1830.        $ASG 'LE' TO T.S                                                         
  1831.        $IF  C.SV=T.SV                                                           
  1832.        $ASG 'BLEZ' TO W.SS                                                      
  1833.        $ELSE                                                                    
  1834.        $ASG 'GE' TO T.S                                                         
  1835.        $IF  C.SV=T.SV                                                           
  1836.        $ASG 'BGEZ' TO W.SS                                                      
  1837.        $ELSE                                                                    
  1838.        $ASG :C.S: TO W.SS                                                       
  1839.        $ENDIF                                                                   
  1840.        $ENDIF                                                                   
  1841.        $ENDIF                                                                   
  1842.        $ENDIF                                                                   
  1843.        $ENDIF                                                                   
  1844.        $ENDIF                                                                   
  1845. I$:W.SV: EQU $                TOP OF LOOP                                       
  1846.        $IF  EE.L#=0                                                             
  1847.        LET  :EE:              DO LET                                            
  1848.        $ENDIF                                                                   
  1849.        $END                                                                     
  1850. *DEFINE VAR VARS                                                                
  1851. *                                                                               
  1852. *      VAR   VAR-LIST                                                           
  1853. *                                                                               
  1854. *      VAR-LIST:=VAR-ITEM!VAR-ITEM,VAR-LIST                                     
  1855. *      VAR-ITEM:=VAR!(VAR,SIZE)                                                 
  1856. *      VAR IS VARIABLE SYMBOL                                                   
  1857. *      SIZE IS NUMBER OF WORDS TO ALLOCATE                                      
  1858.                                                                                 
  1859. VAR    $MACRO  A1,A2,A3,A4,A5,A6,A7,A8                                          
  1860.        DSEG              DATA SEG                                               
  1861.        $IF     A1.L#=0                                                          
  1862.        $VAR3   :A1:                                                             
  1863.        $ENDIF                                                                   
  1864.        $IF     A2.L#=0                                                          
  1865.        $VAR3   :A2:                                                             
  1866.        $ENDIF                                                                   
  1867.        $IF     A3.L#=0                                                          
  1868.        $VAR3   :A3:                                                             
  1869.        $ENDIF                                                                   
  1870.        $IF     A4.L#=0                                                          
  1871.        $VAR3   :A4:                                                             
  1872.        $ENDIF                                                                   
  1873.        $IF     A5.L#=0                                                          
  1874.        $VAR3   :A5:                                                             
  1875.        $ENDIF                                                                   
  1876.        $IF     A6.L#=0                                                          
  1877.        $VAR3   :A6:                                                             
  1878.        $ENDIF                                                                   
  1879.        $IF     A7.L#=0                                                          
  1880.        $VAR3   :A7:                                                             
  1881.        $ENDIF                                                                   
  1882.        DEND              DATA END                                               
  1883.        $IF     A8.L#=0                                                          
  1884.        VAR     :A8:                                                             
  1885.        $ENDIF                                                                   
  1886.        $END                                                                     
  1887. VAR3  $MACRO   A,B                                                              
  1888.        $IF  B.L#=0                                                              
  1889. :A:    BSS  :B:          :B: WORDS NAME :A:                                     
  1890.        $ELSE                                                                    
  1891. :A:    BSS  1            1 WORD NAMED :A:                                       
  1892.        $ENDIF                                                                   
  1893.        $END                                                                     
  1894. *WHILE LOOP MACRO                                                               
  1895. *USES: AC AND LET MACRO                                                         
  1896. *                                                                               
  1897. *      WHILE COND                                                               
  1898. *           [CONDITION COMP IN AC|                                              
  1899. *      DO                                                                       
  1900. *           [LOOP BODY-DONE IF AC TEST IS TRUE|                                 
  1901. *      NEXT                                                                     
  1902. *OR:                                                                            
  1903. *      WHILE COND,<LET EXPR>                                                    
  1904. *      DO                                                                       
  1905. *           [LOOP BODY-DONE IF <LET EXPR> TEST IS TRUE|                         
  1906. *      NEXT                                                                     
  1907.                                                                                 
  1908.        COPY MACROS.NEXT                                                         
  1909.        COPY MACROS.DO                                                           
  1910.                                                                                 
  1911. WHILE  $MACRO          C,EE   START WHILE CONDITIONAL                           
  1912.        $VAR I,E,Q,W,T                                                           
  1913.        $ASG '$$LPS' TO I.S    GET CNTXT VAR                                     
  1914.        $ASG I.SV+1 TO I.SV    PUSH CNTXT                                        
  1915.        $ASG '$$LP' TO Q.S                                                       
  1916.        $ASG :Q::I.SV: TO I.SS MAKE THIS CNTXT NAME                              
  1917.        $ASG '$$LAB' TO E.S    GET UIQUE LABEL                                   
  1918.        $ASG E.SV+1 TO E.SV    INCR                                              
  1919.        $ASG :I.SS: TO W.S     MAKE THIS CNTXT                                   
  1920.        $ASG E.SV TO W.SV      SAVE LABEL IN THIS CNTXT                          
  1921.        $ASG 'EQ' TO T.S                                                         
  1922.        $IF  C.SV=T.SV                                                           
  1923.        $ASG 'BNZ' TO W.SS                                                       
  1924.        $ELSE                                                                    
  1925.        $ASG 'NE' TO T.S                                                         
  1926.        $IF  C.SV=T.SV                                                           
  1927.        $ASG 'BZ' TO W.SS                                                        
  1928.        $ELSE                                                                    
  1929.        $ASG 'LT' TO T.S                                                         
  1930.        $IF  C.SV=T.SV                                                           
  1931.        $ASG 'BGEZ' TO W.SS                                                      
  1932.        $ELSE                                                                    
  1933.        $ASG 'GT' TO T.S                                                         
  1934.        $IF  C.SV=T.SV                                                           
  1935.        $ASG 'BLEZ' TO W.SS                                                      
  1936.        $ELSE                                                                    
  1937.        $ASG 'LE' TO T.S                                                         
  1938.        $IF  C.SV=T.SV                                                           
  1939.        $ASG 'BGZ' TO W.SS                                                       
  1940.        $ELSE                                                                    
  1941.        $ASG 'GE' TO T.S                                                         
  1942.        $IF  C.SV=T.SV                                                           
  1943.        $ASG 'BLZ' TO W.SS                                                       
  1944.        $ELSE                                                                    
  1945.        $ASG :C.S: TO W.SS                                                       
  1946.        $ENDIF                                                                   
  1947.        $ENDIF                                                                   
  1948.        $ENDIF                                                                   
  1949.        $ENDIF                                                                   
  1950.        $ENDIF                                                                   
  1951.        $ENDIF                                                                   
  1952. I$:W.SV: EQU $                TOP OF LOOP                                       
  1953.        $IF  EE.L#=0                                                             
  1954.        LET  :EE:              DO LET                                            
  1955.        $ENDIF                                                                   
  1956.        $END